hibernate的findByExample 外鍵參數查詢解決方案


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM