用了这么长时间的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
类允许你通过一个给定实例构建一个条件查询。
此实例的属性值将做成查询条件。
- Cat cat = new Cat();
- cat.setSex('F');
- cat.setColor(Color.BLACK);
- List results = session.createCriteria(Cat.class)
- .add( Example.create(cat))
- .list();
Example.create(cat) 表示根据cat这个对象来构造一个查询条件。
上面这条语句将查询sex 为 F 而且Color为BLACK的所有Cat记录。
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。
可以自行调整Example使之更实用。
- Example example = Example.create(cat)
- .excludeZeroes() //排除值为0的属性
- .excludeProperty("color") //排除 color属性
- .ignoreCase() //忽略大小写
- .enableLike(); //启用模糊查询
- List results = session.createCriteria(Cat.class)
- .add(example)
- .list();
甚至可以使用examples在关联对象上放置条件。
- List results = session.createCriteria(Cat.class)
- .add( Example.create(cat) )
- .createCriteria("mate")
- .add( Example.create( cat.getMate() ) )
- .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;