用了這么長時間的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;