在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(String sql) {
log .debug( "findSomething" );
List list;
try {
Session session = getSession();
Transaction tx = 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 (RuntimeException re) {
log .error( "findSomething failed" , re);
throw re;
}
}
public List findhql(String hql){
log .debug( "findSomething" );
List list;
try {
Session session = getSession();
Transaction tx = session.beginTransaction();
list= session.createQuery(hql) .list();
tx.commit();
session.close();
return list;
} catch (RuntimeException re) {
log .error( "findSomething failed" , re);
throw re;
}
}
}
//*****************************************************************************
在这里,SQL 相对于 HQL 就要逊色一点了,每一次查询都要显式地调用 addEntity ()方法来加载对应的实体。不过 HQL 语句尽管强大但却难于读懂,所以在不熟悉 HQL 的情况下, SQL 仍是较佳选择。
//*****************************************************************************
private UtilSqlDAO SqlDAO ;
// 执行 SQL 语句的方法
public List findByVip (String vip){
SqlDAO = new UtilSqlDAO();
String sqlStr = "select {c.*},{b.*},{rt.*},{r.*} " +
"from client c ,booking b ,roomtype rt ,room r " +
"where c.c_vip=b.c_vip and b.rt_name=rt.rt_name and
rt.rt_name=r.rt_name and r.rs_no='10' and b.c_vip='" +
vip+ "'" ;
List res = SqlDAO .findBySQL(sqlStr);
if (!res.isEmpty()){
return res;
}
else {
return null ;
}
}
//**************************************************************************************
private UtilSqlDAO hqlDAO ;
// 执行 HQL 语句的方法
public List findSomethingByHQL(String property,String value){
hqlDAO = new UtilSqlDAO();
/*left join ***使用此种HQL查出来的List中,每个List节点包含3个Object对象,依次为goin,room,client;
* 若加上fetch(意为抓取),则自动打包到一实体,即每个List节点之包含一个goin对象,room和client对象被加载到goin里了
* */
String hql = "from Goin goin left join fetch goin.room left join fetch goin.client where goin." +property+ "='" +value+ "'" ;
return hqlDAO .findhql(hql);
}