hibernate的findByExample

来源:互联网 发布:java引用数据类型 编辑:程序博客网 时间:2024/05/21 16:21

from:http://licg1234.blog.163.com/blog/static/139082333201021521812603/

用了这么长时间的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条件为:

 

    select * from 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(); 




关于使用Hibernate findByExample的注意事项

from:http://www.85java.com/viewthread.php?tid=2259


findByExample是一个很便利的查询的方法,通过传入的实例,进行条件匹配生成查询语句。

但之前一直很少用这个方法,原因是之前发现不知道什么情况下查询结果跟自己想要生成的不同。还是学习方式不同吧,对于陌生的东西出现问题了就不管不用了,这样是不行了。现在又遇到了,却很快的发现问题所在了。

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

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

下面是查询参考:
Java代码
@Override  
public AppsAccount findByUserAndApp(Users user, Apps app) {   
    final DetachedCriteria query = DetachedCriteria   
            .forClass(AppsAccount.class);   
    Criteria criteria = query.getExecutableCriteria(getSession());   
    criteria.add(Restrictions.eq("users", user));   
    criteria.add(Restrictions.eq("apps", app));   
  
    @SuppressWarnings("unchecked")   
    List<AppsAccount> list = criteria.list();   
    if (list != null && !list.isEmpty()) {   
        return list.get(0);   
    }   
    return null;   
}  

        @Override
        public AppsAccount findByUserAndApp(Users user, Apps app) {
                final DetachedCriteria query = DetachedCriteria
                                .forClass(AppsAccount.class);
                Criteria criteria = query.getExecutableCriteria(getSession());
                criteria.add(Restrictions.eq("users", user));
                criteria.add(Restrictions.eq("apps", app));

                @SuppressWarnings("unchecked")
                List<AppsAccount> list = criteria.list();
                if (list != null && !list.isEmpty()) {
                        return list.get(0);
                }
                return null;
        }

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

AppsAccount.class类
Java代码
public class AppsAccount implements java.io.Serializable {   
  
    // Fields   
  
    /**  
     *   
     */  
    private static final long serialVersionUID = 2255050572597512586L;   
    private String id;   
    private Users users;   
    private Apps apps;   
    private String account;