在Hibernate 中,多主键表对应的实体会包含一个 ID 类, Hibernate 会把那多个主键封装成一个 ID 类以供调用。当要查询多主键表的其中一个主键时,往往要自定义一 SQL 语句或 HQL 语句来完成查询。
以下是Hibernate 实现自定义 SQL 与 HQL 查询的执行类:
//**************************************************************************
public class UtilSqlDAO extends BaseHibernateDAO{
private static final Log log =LogFactory. getLog (UtilSqlDAO. class );
public List findBySQL(Stringsql){
log .debug( "findSomething" );
List list;
try {
Sessionsession=getSession();
Transactiontx=session.beginTransaction();
list= session.createSQLQuery(sql).
addEntity( "c" ,Client. class ).
addEntity( "b" ,Booking. class ).
addEntity( "rt" ,Roomtype. class ).
addEntity( "r" ,Room. class ).list();
//实体加载的顺序要与 SQL 语句里表的查询顺序一致!
tx.commit();
session.close();
return list;
} catch (RuntimeExceptionre){
log .error( "findSomethingfailed" ,re);
throw re;
}
}
public List findhql(Stringhql){
log .debug( "findSomething" );
List list;
try {
Sessionsession=getSession();
Transactiontx=session.beginTransaction();
list= session.createQuery(hql) .list();
tx.commit();
session.close();
return list;
} catch (RuntimeExceptionre){
log .error( "findSomethingfailed" ,re);
throw re;
}
}
}
//*****************************************************************************
在这里,SQL 相对于 HQL 就要逊色一点了,每一次查询都要显式地调用 addEntity ()方法来加载对应的实体。不过 HQL 语句尽管强大但却难于读懂,所以在不熟悉 HQL 的情况下, SQL 仍是较佳选择。
//*****************************************************************************
private UtilSqlDAO SqlDAO ;
// 执行 SQL 语句的方法
public List findByVip (Stringvip){
SqlDAO = new UtilSqlDAO();
StringsqlStr= "select{c.*},{b.*},{rt.*},{r.*}" +
"fromclientc,bookingb,roomtypert,roomr" +
"wherec.c_vip=b.c_vipandb.rt_name=rt.rt_nameand
rt.rt_name=r.rt_nameandr.rs_no='10'andb.c_vip='" +
vip+ "'" ;
List res= SqlDAO .findBySQL(sqlStr);
if (!res.isEmpty()){
return res;
}
else {
return null ;
}
}
//**************************************************************************************
private UtilSqlDAO hqlDAO ;
// 执行 HQL 语句的方法
public List findSomethingByHQL(Stringproperty,Stringvalue){
hqlDAO = new UtilSqlDAO();
/*leftjoin***使用此种HQL查出来的List中,每个List节点包含3个Object对象,依次为goin,room,client;
*若加上fetch(意为抓取),则自动打包到一实体,即每个List节点之包含一个goin对象,room和client对象被加载到goin里了
**/
Stringhql= "fromGoingoinleftjoinfetchgoin.roomleftjoinfetchgoin.clientwheregoin." +property+ "='" +value+ "'" ;
return hqlDAO .findhql(hql);
}