Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 418|回复: 0

hibernate的findByExample 外键参数查询解决方案

[复制链接]
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-7-20 17:06:10 | 显示全部楼层 |阅读模式

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

    微博来自http://blog.sina.com.cn/s/blog_4745d1c101013w8z.html

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-17 09:40 , Processed in 4.043889 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表