Hibernate QBE 复合查询问题

首先,有两个实体,分别是Client和Trade,它们之间是一对多的关系。

Client类部分代码如下:

 

Trade类部分代码如下:

 

当我做复合查询即按照trade的date属性和client的id属性去查询时,如果是通过criteria.add(Example)方式,则查询返回的结果是所有trade,查询代码如下:

 

后台打印出的sql语句为:

 

如果查询client时,不使用Example,而使用criteria.add(Restrictions.eq())方式,则会查询出满足条件的记录,查询代码如下:

 

后台打印的sql语句如下:

 

可以看到,使用这种方式查询时,在where条件中会有client1_id=?,而使用Example就没有。不知道什么原因,困扰了我好几天了。

虽然可以使用这中方式,解决使用Example查询时的问题,但我想弄明白原因。

 

刚才试了下查询Client的非主键属性,则查询结果为满足条件的记录。where条件语句中and后面会加上Client的条件,而不是1=1了。

所以,在做复合查询时首先要判断是否为主键查询,主键查询需要区别对待,需要使用userCriteria.add(Restrictions.idEq(id)),我想着也就是为什么会有idEq这个方法的原因吧,而且如果只是主键查询,那么打印出的sql语句中and后面会有client1_id=? and 1=1。

 

解释下hibernate打印出的sql语句,复合查询使用Example时,hibernate打印出的sql语句where部分其实分为两个部分,第一个部分是针对主表的查询条件,第二部分是针对关联表的查询条件。

如果没有查询条件,那么打印出的sql语句where部分为:

where 1=1 and 1= 1

 

如果是主表的非主键查询条件,那么打印出的sql语句where部分为:

where 主表条件 and 1=1

 

如果是主表的主键查询条件,那么打印出的sql语句where部分为:

where this_.id=? and 1=1  and 1=1

[注] this_.id=? and 1=1属于查询的第一部分,主表查询条件。主键查询需要使用criteria.add(Restrictions.idEq(id))。

 

如果是关联表的查询条件,那么打印出的sql语句where部分为:

where 1=1 and 关联表条件

 

如果是按照关联表的主键查询,那么打印出的sql语句where部分为:

where 1=1 and 关联表.id = ? and 1=1

[注] 关联表.id = ? and 1=1属于查询的第二部分,关联表查询条件。主键查询需要使用criteria.add(Restrictions.idEq(id))。

 

总结:

Hiberante在使用QBE查询时,如果是对主键查询,是不起作用的,即使主键设置了值。

在这种情况下,需要对主键查询时,可以使用criteria.add(Restrictions.idEq(id))来实现。

 

展开阅读全文

没有更多推荐了,返回首页