Hi guys, I posted this question on stackoverflow last week, but didn't get an answer, so I decided to re-posted it here.
Using OrientDB v2.2.12. I'm trying to execute a simple sql query to retrieve data from the document searched as well as few properties of a connected document. But, for some reason ran into a dead wall on how to select the property from the connected document. Here is my simple scenario:
I have 2 documents, an Account and a User. Account document has an edge to a User named 'Employs'. I'm trying to login a user by email and password. If record for the user is found, I simply need to get some user data from the User class (works fine) and few properties from an account document (doesn't work right) to be stored in user's session.
Here is my query:
try (ODatabaseDocumentTx db = DbPool.getConnection()) {
String sql
= " select @rid.asString() as userRid, firstName, lastName, "
+ " active as userActive, in('Employs') as account "
+ "from User "
+ "where email = ? and password = ?";
OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<>(sql);
List<ODocument> result = db.command(query).execute('te...@test.com', 'abc');
ODocument d = result.get(0);
System.out.println("1 "+ d.field("account.id")); // <-- fails here
System.out.println("2 "+ d.field("userRid"));
System.out.println("3 "+ d.field("account.company")); // <-- fails here
System.out.println("4 "+ d.field("firstName"));
System.out.println("5 "+ d.field("lastName"));
System.out.println("6 "+ d.field("account.active")); // <-- fails here
System.out.println("7 "+ d.field("userActive"));
return new SessionUser(
d.field("account.id"),
d.field("userRid"),
d.field("account.company"),
d.field("firstName"),
d.field("lastName"),
d.field("account.active"),
d.field("userActive"));
}
It fails to create the SessionUser object. More specifically, it fails on retrieval of the account properties. Here is how the data looks in System.out:
1 [17]
2 #37:0
3 [Seller 1]
4 Mike
5 Maloney
6 [true]
7 true
WARN : 2016-11-21 17:53:53,036 WARN c.t.e.k.c.ExceptionHandler - Error: java.util.LinkedHashSet cannot be cast to java.lang.Integer
I do see that the account properties are coming in as objects, just can't figure out how to select them easy. I didn't want to go through manually casting list then set, etc. to get to a simple account.id element. I'm sure there is a straight forward way, just can't see it. For example, if I can't use this d.field("account.id") then how do I get the ID 17?
What is the right way to select data of a connected document? Or, is there a better way to construct the query itself?
Thanks.
in('Employs')
returns a list, if you know that it can be only one document in it you can try modifying your query adding [0]
String sql
= " select @rid.asString() as userRid, firstName, lastName, "
+ " active as userActive, in('Employs')[0] as account "
+ "from User "
+ "where email = ? and password = ?";
EDIT
Alternatively you can change a little your code as follow (I've simplified the query just for testing):
String dbName = "stack40732762";
OrientGraphFactory dbfactory = new OrientGraphFactory("remote:127.0.0.1:2424/"+dbName, "root", "root").setupPool(1, 50);
OrientGraph db = dbfactory.getTx();
// ODatabaseDocumentTx db = DbPool.getConnection()
try {
String query = "select name, in('Employs')[0] as account from user where name = ?";
//
// OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<>(sql);
// List<ODocument> result = db.command(query).execute();
Iterable<OrientVertex> result = db.command(new OCommandSQL(query)).execute("pippo");
while(result.iterator().hasNext()){
OrientVertex d = result.iterator().next();
// System.out.println("1 "+ d.field("account.id")); // <-- fails here
System.out.println("1 " + d.getProperty("account.id")); // <-- this works!
// System.out.println("2 "+ d.field("name"));
System.out.println("2 " + d.getProperty("name"));
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
Bye,
Ivan
Hi guys, I posted this question on stackoverflow last week, but didn't get an answer, so I decided to re-posted it here.
Using OrientDB v2.2.12. I'm trying to execute a simple sql query to retrieve data from the document searched as well as few properties of a connected document. But, for some reason ran into a dead wall on how to select the property from the connected document. Here is my simple scenario:
I have 2 documents, an Account and a User. Account document has an edge to a User named 'Employs'. I'm trying to login a user by email and password. If record for the user is found, I simply need to get some user data from the User class (works fine) and few properties from an account document (doesn't work right) to be stored in user's session.
Here is my query:
try (ODatabaseDocumentTx db = DbPool.getConnection()) { String sql = " select @rid.asString() as userRid, firstName, lastName, " + " active as userActive, in('Employs') as account " + "from User " + "where email = ? and password = ?"; OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<>(sql); List<ODocument> result = db.command(query).execute('test...@test.com', 'abc'); ODocument d = result.get(0); System.out.println("1 "+ d.field("account.id")); // <-- fails here System.out.println("2 "+ d.field("userRid")); System.out.println("3 "+ d.field("account.company")); // <-- fails here System.out.println("4 "+ d.field("firstName")); System.out.println("5 "+ d.field("lastName")); System.out.println("6 "+ d.field("account.active")); // <-- fails here System.out.println("7 "+ d.field("userActive")); return new SessionUser( d.field("account.id"), d.field("userRid"), d.field("account.company"), d.field("firstName"), d.field("lastName"), d.field("account.active"), d.field("userActive")); }
System.out.println("3 " + d.getProperty("account.@rid"));
d.field("account.@rid")
d.field("account")
System.out.println("acc rid = "+ d.field("account.@rid"));
System.out.println("acc rid = "+ d.field("account"));
acc rid = Account#25:0{...}
acc rid = Account#25:0{...}
System.out.println("3 " + d.getProperty("account.@rid"));
System.out.println("3 " + d.getProperty("account"));
3 v(Account)[#25:0]3 v(Account)[#25:0]
String query = "select name, in('Employs')[0] as account, in('Employs')[0].asString() as accRid from user where name = ?";
System.out.println("3 " + d.getProperty("accRid"));
//System.out.println("3 " + d.field("accRid"));
--
3 #25:0