关于使用Hibernate findByExample的注意事项

findByExample是一个很便利的查询的方法,通过传入的实例,进行条件匹配生成查询语句,即根据你传递的对象属性是否为null来判断是否要加上这个条件的,但要注意:

1. findByExample只为example中的基本类型属性生效,如果example的属性中有bean的话(一般有外键时就会出现了)就会无法转成SQL查询条件。甚至很多时候会产生where (1=1)的条件,相信会令人很迷惑。


解决办法很简单吧,遇到这种情况可以直接使用SQL或条件查询(Criteria),更推荐使用Criteria。

下面是查询参考:
Java代码   收藏代码
  1. @Override  
  2. public AppsAccount findByUserAndApp(Users user, Apps app) {  
  3.     final DetachedCriteria query = DetachedCriteria  
  4.             .forClass(AppsAccount.class);  
  5.     Criteria criteria = query.getExecutableCriteria(getSession());  
  6.     criteria.add(Restrictions.eq("users", user));  
  7.     criteria.add(Restrictions.eq("apps", app));  
  8.   
  9.     @SuppressWarnings("unchecked")  
  10.     List<AppsAccount> list = criteria.list();  
  11.     if (list != null && !list.isEmpty()) {  
  12.         return list.get(0);  
  13.     }  
  14.     return null;  
  15. }  


因为是跟spring整合,所以用getSession()方法传入session。

AppsAccount.class类
Java代码   收藏代码
  1. public class AppsAccount implements java.io.Serializable {  
  2.   
  3.     // Fields  
  4.   
  5.     /** 
  6.      *  
  7.      */  
  8.     private static final long serialVersionUID = 2255050572597512586L;  
  9.     private String id;  
  10.     private Users users;  
  11.     private Apps apps;  
  12.     private String account;  
  13.   
  14.         ..... 

2. 类型是int类型,默认值为0,所以也会作为条件;
解决方法:可以把java类里的parentId类型改为Integer


=============

用了这么长时候的hibernate/spring,若是不是今天用的findByExample办法到如今还不知道findByExample的机制。

Class User{

String username;
String password = "默认口令";
Company company;
getter()&setter().....
}

 

Company company = companyDao.getById("id");
User user = new User();
user.setSid("主键");
uer.setUsername("user");
use.setCompany(company);
userDao.findByExample(user);

 

这个时辰的SQL前提为:

 

* user
where username = ?
and password = ?

 



findByExample()应用时得出结论:
1.不支撑主键
2.不支撑接洽关系(即一个类作为另一个类方法的参数。)
3.不支撑NULL

 

 

 

 

查询示例
org.hibernate.criterion.Example
类容许你经由过程一个给定实例构建一个前提查询。
此实例的属性值将做成查询前提。

Java代码
  1. Cat cat =new Cat();
  2. cat.setSex(""F"");
  3. cat.setColor(Color.BLACK);
  4. List results = session.createCriteria(Cat.class
  5. .add( Example.create(cat))
  6. .list();

Example.create(cat) 默示按照cat这个对象来机关一个查询前提。
上方这条语句将查询sex 为 F 并且Color为BLACK的所有Cat记录。
版本属性、标识符和接洽关系被忽视。默认景象下值为null的属性将被打消。
可以自行调剂Example使之更实用。

Java代码
  1. Example example = Example.create(cat)
  2. .excludeZeroes()//打消值为0的属性
  3. .excludeProperty("color"//打消 color属性
  4. .ignoreCase()//忽视大小写
  5. .enableLike();//启用模糊查询
  6. List results = session.createCriteria(Cat.class
  7. .add(example)
  8. .list();

甚至可以应用examples在接洽关系对象上放置前提。

Java代码
  1. List results = session.createCriteria(Cat.class
  2. .add( Example.create(cat) )
  3. .createCriteria("mate"
  4. .add( Example.create( cat.getMate() ) )
  5. .list();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值