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

hibernate的findByExample 外键参数查询解决方案的更多相关文章

  1. 基于EF的数据外键关联查询

    现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...

  2. HIBERNATE一对一双向外键联合主键关联

    HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...

  3. pythonのsqlalchemy外键关联查询

    #!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...

  4. HIbernate基于外键的查询

    此文以个人开发记录为目的,笔拙勿喷 项目是背景是公司的E签宝平台VIP频道项目进行关联账户增加后,需要做删除时的,联合查询 当前主要表结构账户表Account. CREATE TABLE `accou ...

  5. 【Hibernate】无外键多表查询

    无外键多表查询时编写hql,直接使用逗号分隔表,where作为联合查询条件进行查询.查询出来的结果可为两种,List<List<Object>>或者List<Map< ...

  6. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  7. Hibernate 只获取外键id,不获取内容

    Hibernate,jpa注解映射中 A多对一B A的表中有B的外键. 如果想只获取A表中的B的外键而不想发送查询B的sql语句. 那么: @ManyToOne(fetch=FetchType.LAZ ...

  8. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

  9. hibernate一对一双向外键关联

    一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...

随机推荐

  1. 如何拷贝一个wchar_t类型的字符串

    Do this, wchar_t clone[260]; wcscpy(clone,szPath); Or, if you want to allocate memory yourself, wcha ...

  2. curl_setopt — 设置 cURL 传输选项

    curl_setopt (PHP 4 >= 4.0.2, PHP 5, PHP 7) curl_setopt — 设置 cURL 传输选项 bool curl_setopt ( resource ...

  3. MySQL8.0手动安装心得。

    https://dev.mysql.com/downloads/mysql/ mysql从5.7一下子跳跃到了8.0,其中的改变还是很大,有点这里就不说了,小伙伴们自己去百度了解一下,这里重点说一下, ...

  4. Masonry应用【美图秀秀首页界面自动布局】

    Masonry在此实现时候,并没有比NSLayoutConstraint简单,相反我觉得还不如NSLayoutConstraint. [self.topView mas_makeConstraints ...

  5. java enum 用法

    /* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat Inc. or th ...

  6. Android开发——Android M(6.0) 权限解决方案

    Android开发--Android M(6.0) 权限解决方案 自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Andro ...

  7. Oracle数据表中输入引号等特殊字符

    Oracle输入特殊字符的特殊方法: UPDATE BOOKMARK SET BM_VALUE=q'/ --在这里写下需要输入的内容(可以包括引号.回车等特殊的符号),所见即所得 /' -- WHER ...

  8. WinForm程序开发

    WinForm程序开发------------------------------主要页面----------------------------------BaseForm.cs    基类,用于派 ...

  9. LeetCode Linked List Cycle II 和I 通用算法和优化算法

    Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cyc ...

  10. 一个JAVA的WEB服务器事例

    其实编写一个入门级别的JAVA的WEB服务器,很简单,用SOCKET类即可实现.相关内容可以参考:http://www.cnblogs.com/liqiu/p/3253022.html 一.首先创建一 ...