2011-02-23 42 views
3

我想在實體上的屬性的內容進行搜索Hibernate的標準:由財產清單上的內容搜索中的實體

我有一個簡單的類來定義用戶:

@Entity 
public class User { 

    @Id 
    @Column(name = "pers_id") 
    private int persId; 

    @Column(name = "full_name") 
    private String fullName;  

    @OneToMany 
    @JoinColumn(name = "PERS_ID") 
    private List<UserLanguages> languages = new ArrayList<UserLanguages>(); 
} 

一用戶可以有多種語言,這裏是用戶和語言之間的鏈接。

@Entity 
public class UserLanguages { 
    @Column(name="pers_id") 
    private int persId; 

    @Id 
    @Column(name="lang_iso_code") 
    private String langISO; 

    @Column(name="lang_full_name") 
    private String langFullName; 

    @Column(name="order_seq") 
    private int order; 
} 

@Entity 
public class Language { 
    @Id 
    @Column(name="ID") 
    private long id; 

    @Column(name = "CODE") 
    private String code; 
} 

我創建了一個對象做搜索:

public class UserFilter {  
    private String name; 

    private List<Language> languages; 
} 

我已經定義了一個服務:

@Service("userService") 
public class UserServiceImpl implements UserService { 

@Override 
public List<User> findByFilter(UserFilter userFilter) { 
    final Criteria criteria = userDao.createCriteria(); 
    if (userFilter.getName() != null) { 
     for (final String token : userFilter.getName().toLowerCase().trim().split(" ")) { 
     criteria.add(Restrictions.like("fullName", "%" + token + "%")); 
     } 
    } 

    if (null != userFilter.getLanguages() && userFilter.getLanguages().size() > 0) { 

     final List<String> contents = new ArrayList<String>(userFilter.getLanguages().size()); 
     for (final Language lang : userFilter.getLanguages()) { 
     contents.add(lang.getCode()); 
     }  
     criteria.add(Restrictions.in("languages", contents)); 
    } 

    return userDao.findByCriteria(criteria); 
} 

我的問題是我怎麼能對語言進行搜索。我想用userFilter參數中定義的這個或全部語言來查找所有用戶。 有關語言的部分在服務中的findByFilter方法中不起作用。你可以幫我嗎?

回答

8

首先,UserLanguages實體應該命名爲UserLanguage:它代表一種語言,而不是幾種。

然後,pers_id列是User實體的外鍵。因此它應該映射爲與用戶實體的ManyToOne關係而不是基本列。

最後,並回答你的問題(我假設你想找到有其langISO代碼是在contents列表的至少一個用戶的語言用戶):你應該使用一個連接:

// inner join between User and UserLanguages 
criteria.createAlias("languages", "userLanguage"); 
// restriction on the langISO property of UserLanguage 
criteria.add(Restrictions.in("userLanguage.langIso", contents)); 
+1

好的謝謝。我已經將UserLanguages更改爲UserLanguage,您是對的。現在,我使用了ManyToOne關係。但我不明白從哪裏來的language.langIso在最後的限制? – BasicCoder 2011-02-23 11:40:09

+0

對不起。我忘記了雙引號和用戶前綴。我更新了我的答案。 – 2011-02-23 12:35:05