zoukankan      html  css  js  c++  java
  • hibernate的findByExample

    用了这么长时间的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;

  • 相关阅读:
    GetWindowThreadProcessId
    为什么要学制作外挂
    博客系统架构对比分析
    C# 数据库访问通用类 (ADO.NET)
    转:配置 SQL Server 2005 远程调试存储过程
    腾讯QQ空间g_tk算法
    BurstNET的linux vps 安装Kloxo面板后一切正常 今天重启导致错误Could not connect to Mysql server
    service的生命周期回调方法
    服务的生命周期回调方法
    点阵字库在JAVA中的实现
  • 原文地址:https://www.cnblogs.com/zhangchunxi/p/3028631.html
Copyright © 2011-2022 走看看