Hi Ivan,
In my original logic "d" is of type ODocument
(http://orientdb.com/javadoc/2.2.x/com/orientechnologies/orient/core/record/impl/ODocument.html)
and it doesn't have .getProperty(...) method.
Can I get the account.@rid from the SQL API and not the Graph API?
On Wednesday, November 30, 2016 at 3:14:43 PM UTC-8, Ivan Mainetti wrote:
>
> using getProperty, like in my example code, you can do
> System.out.println("3 " + d.getProperty("account.@rid"));
>
> I don't know if it works even with *field()* method
>
>
> Il giorno mercoledì 30 novembre 2016 23:28:26 UTC+1, Borov ha scritto:
>>
>> One more question,
>>
>> What is the way to get account @rid from this field "in('Employs')[0] as
>> account"? I can get all fields, but not the @rid.
>>
>>
>>
>> On Monday, November 28, 2016 at 2:42:13 PM UTC-8, Ivan Mainetti wrote:
>>>
>>> Hi,
>>>
>>> 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
>>>
>>>
>>> Il giorno lunedì 28 novembre 2016 21:09:14 UTC+1, Borov ha scritto:
>>>>
>>>> Hi guys, I posted this question on stackoverflow
>>>> <http://stackoverflow.com/questions/40732762/orientdb-cant-select-data-from-connected-document>
>>>> 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('[email protected]',
>>>> '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
>>>>
>>>>
>>>> *Here is how a single account.id <http://account.id> property looks
>>>> like in the debugger*
>>>>
>>>>
>>>> <https://lh3.googleusercontent.com/-YOuTE7s3Nkw/WDyMiR8VZkI/AAAAAAAAAAw/a9h1gGLIq4wmpCHi6rbAjF1DjnfddNhyQCLcB/s1600/Screen%2BShot%2B2016-11-21%2Bat%2B5.48.02%2BPM.png>
>>>>
>>>>
>>>> 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.
>>>>
>>>>
--
---
You received this message because you are subscribed to the Google Groups
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.