2012-12-20 21 views
2

我需要在DB_TABLE的子句查询中使用hibernate执行SQL。 in子句包含值对。我使用组件映射的帮助来查询(tid,mid)对,如下所示。Hibernate高级条款

我现在需要为另一对示例(tid,organization)额外执行in子句查询。我该怎么做呢?

目标SQL查询

select * from DB_TABLE where (c_tid, c_mid) in (('t1', 'm1'), etc.) 

Java的查询代码

function List<DBTable> getDBTableList(List<TidMidId> tidMidList) { 
    Criterion crit = Restrictions.in("tidMidId", tidMidList.toArray()); 
    // pom is hibernate wrapper 
    return pom.getObjects(DBTable.class, crit); 
} 

Hibernate映射:

<class name="com.DBTable" table="DB_TABLE" > 
    <id name="id" type="long" column="K_ID"> 
     <generator class="sequence"> 
      <param name="sequence">DB_TABLE$SEQ</param> 
     </generator> 
    </id> 

    <component name="tidMidId" class="com.TidMidId"> 
     <property name="tid" type="string" column="C_TID"/> 
     <property name="mid" type="string" column="C_MID"/> 
    </component> 
    <property name="organisation" type="string" column="C_ORGANISATION"/> 
    <property name="createTimestamp" type="timestamp" column="D_CREATE_TIMESTAMP"/> 
    <property name="modTimestamp" type="timestamp" column="D_MOD_TIMESTAMP"/> 
</class> 

回答

1

你为什么不使用HQL?让Hibernate采用SQL的护理:

Query q = session.createQuery("FROM com.DBTable x WHERE x.tidMidId.tid = ? AND x.tidMidId.mid = ?"); 
q.setString(0, "t1"); 
q.setString(1, "m1"); 
return (List<com.DBTable>) q.list(); 

增加更多的参数一样简单:

q = ".... AND x.organisation = ?"); 
q.setString(3, "someOrganization"); 
+0

伟大的答案,但同时遵循相同的形式给出了Hibernate是生成4内部2.可以请参阅此连接,而不是题。 http://stackoverflow.com/questions/30613881/hibernate-query-gnerating-4-inner-join-where-i-specified-only-2-join-in-query – anirban