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;


免責聲明!

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



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