http://www.java-cn.com/club/html/07/n-1807.html
先解释一下标题的含义:为了实现一个组合条件查询,先是使用HQL书写,然后改用Query by Criteria方式,再尝试Query by Example,最后自己实现了一个增强的Example类来解决问题。
5n;H1H(Yb.AmoJAVA中文站社区门户(D*BS&zP6x;R
关于此问题的起源请阅读我以前的一个帖子:http://www.iteye.com/post/523791。在该帖子中已经实现了从HQL到QBC的转变,在这里就不再重复了。
z+MsO1f k+L`4RaJAVA中文站社区门户 h.C3h1Q m5r1_
在上一个帖子中没有模型类Product及Category的代码,为了方便讨论补充如下: JAVA中文站社区门户!iWY)ehYt&a2x(A
JAVA中文站社区门户 DP,o@+yLk
Java代码
1.public class Category {
2. private Long id; 3. private String name; //类别名称 4.
5. //Other code omitted 6.}
7.
8.public class Product { 9. private Long id; 10. private String name; //商品名称 11. private Category category; //商品类别 12. private Date expDate; //有效期 13. private Float price; //单价 14.
15. //Other code omitted 16.}
public class Category {
private Long id;
private String name; //类别名称
//Other code omitted
}
public class Product {
private Long id;
private String name; //商品名称
private Category category; //商品类别
private Date expDate; //有效期
private Float price; //单价
//Other code omitted
}
JAVA中文站社区门户a5W-F1vB(Qr
;k2du$W4n@/U Us/?Q&H从前一个帖子中可以看到,使用QBC后代码有所减少,但还是得把构造查询条件的代码写死,这非常不爽。重读了《Java Persistence with Hibernate》一书,发觉QBE是个好东东,于是尝试用改造代码如下: JAVA中文站社区门户K%d(j:Q~
JAVA中文站社区门户P;Uf,BO$[ZQB.U)X
Java代码
1.public List<Product> getProducts(Product product) {
2. final Example exampleProduct = 3. Example.create(product).
4. enableLike(MatchMode.ANYWHERE).
5. excludeZeroes();
6.
7. return (List<Product>) getHibernateTemplate().execute( 8. new HibernateCallback() { 9. public Object doInHibernate(Session session) throws HibernateException { 10. Criteria crit =
11. session.createCriteria(Product.class). 12. add(exampleProduct);
13. return crit.list(); 14. }
15. }
16. );
17.}
public List<Product> getProducts(Product product) {
final Example exampleProduct =
Example.create(product).
enableLike(MatchMode.ANYWHERE).
excludeZeroes();
return (List<Product>) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria crit =
session.createCriteria(Product.class).
add(exampleProduct);
return crit.list();
}
}
);
}