用了这么长时间的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. ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea

    这是一篇没有图的好文章,对于学习android的非常实用 1.首先到orcale官网    http://www.oracle.com/technetwork/java/javase/download ...

  2. 红米1线刷救砖教程V5版(移动联通适用,线刷包永久有效)

    红米1线刷救砖教程V5版(移动联通适用,线刷包永久有效) 原文来自:http://www.miui.com/thread-1890972-1-1.html?mobile=2 ,加了些自己的经验. (我 ...

  3. spring 读取配置文件,将值注入到静态字段

    resources/config/config-dev.properties es.ip.node=xxxxxxxcluster.name=xxxxxxxclient.transport.sniff= ...

  4. 在sublime text2上安装xdebug

    目录 安装Xdebug extension 设定php.ini 安装Xdebug plugin for Sublime Text2 1.安装Xdebug extension 先从安装Xdebug开始, ...

  5. ExtJS学习笔记2:响应事件、使用AJAX载入数据

    响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 v ...

  6. 解决Android Studio无法下载sdk的问题

    因为google被墙了,android sdk无法下载.然后各种百度,都是说让设置代理,给的代理地址一般都是用的下面这个代理服务器: 大连东软信息学院镜像服务器地址: mirrors.neusoft. ...

  7. js开发思路

    $.ui = $.ui || {}; var version = $.ui.version = "1.12.1"; // 是否为ie浏览器 var ie = $.ui.ie = ! ...

  8. C++ 第三课:常量转义字符

    常量转义字符 以下的转义字符使普通字符表示不同的意义. 转义字符 描述 \' 单引号 \" 双引号 \\ 反斜杠 \0 空字符 \a 响铃 \b 后退 \f 走纸 \n 换行 \r 回车 \ ...

  9. JAVA的Spring注入机制事例详解

    一.前言 最近使用Spring里面的依赖注入,比如StudentServiceImple2.java代码: package di.service.imple; import com.mengya.sp ...

  10. 神器phpstorm功能具体解释

    phpstorm包括了webstorm的所有功能,更可以支持php代码. PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,高速导航以及即 ...