Hibernate学习手记(4)--自定义查询

Hibernate 中,多主键表对应的实体会包含一个 ID 类, Hibernate 会把那多个主键封装成一个 ID 类以供调用。当要查询多主键表的其中一个主键时,往往要自定义一 SQL 语句或 HQL 语句来完成查询。

以下是Hibernate 实现自定义 SQLHQL 查询的执行类:

//**************************************************************************

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值