findByExample是一个很便利的查询的方法,通过传入的实例,进行条件匹配生成查询语句,即根据你传递的对象属性是否为null来判断是否要加上这个条件的,但要注意:
1. findByExample只为example中的基本类型属性生效,如果example的属性中有bean的话(一般有外键时就会出现了)就会无法转成SQL查询条件。甚至很多时候会产生where (1=1)的条件,相信会令人很迷惑。
解决办法很简单吧,遇到这种情况可以直接使用SQL或条件查询(Criteria),更推荐使用Criteria。
下面是查询参考:
- @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类
- 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;
- .....
2. 类型是int类型,默认值为0,所以也会作为条件;
解决方法:可以把java类里的parentId类型改为Integer
=============
用了这么长时候的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前提为:
* 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();