Jpa ejbql query by list property

504 Views Asked by At

I have objects:

PersenInfo : (long id,String name, String lastName,String email)
AnsMsg : (long id,PersenInfo fromPersoninfo,String theMsg)
Person : (PersonInfo personInfo, List<AnsMsg> msgs)

person.hbm look like this:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated May 4, 2012 2:48:41 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="Entities.Person" table="PERSON">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <many-to-one name="personInfo" class="Entities.PersonInfo" cascade="all" not-null="false" lazy="false"/>

        <property name="_pass" type="java.lang.String" access="field" lazy="false">
            <column name="_PASS" />
        </property>
        <property name="_IsConnect" type="int" access="field" lazy="false">
            <column name="_ISCONNECT" />
        </property>
        <property name="c2dmId" type="java.lang.String" lazy="false">
            <column name="C2DMID" />
        </property>

        <property name="lastSeen" type="long" lazy="false">
            <column name="LASTSEEN" />
        </property>
        <list name="msgList" inverse="false" table="ANSMSG" lazy="false" >
             <key column="parent_id" />
              <index column="idx"  />
            <one-to-many class="msg.AnsMsg"  />
        </list>
    </class>
</hibernate-mapping>

now i try to get all the AnsMsg list that fromPerson=6 and all AnsMsg that parent_id=3;

how my query should look like? ( i mean something like this:

"from AnsMsg ansMsg where ansMsg.fromPerson.id='6' or ansMsg.parent_id='6'" 

of course this query didn't suppose to work.. )

this how my data lookalike:

Db example

thanks in advance.

1

There are 1 best solutions below

2
On

Try this:

select m.* from Person p, p.msgList m, m.fromPersonInfo f where p.id = 6 or f.id = 6
  1. Parent id (the recipient, I suppose) is determined joining Person and AnsMsg tables.
  2. Messages sent by someone are retieved using m.fromPersonInfo.id, although JPA can't evaluate such expression, so, have to be detached to m.fromPersonInfo f and f.id = 6

Obs.: If you use Person and PersonInfo instances as parameters of your query you should do like this: select m.* from Person p, p.msgList m where p = :person or m.fromPersonInfo = :fromPersonInfo