[英]Hibernate criteria: search by content on a property list in an entity
我想通過內容搜索實體中的屬性
我有一個簡單的類來定義用戶:
@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中不起作用。 你能幫助我嗎?
首先, UserLanguages
實體應該命名為UserLanguage
:它代表一種語言,而不是幾種語言。
然后, pers_id
列是User
實體的外鍵。 因此,它應該作為ManyToOne關系映射到User實體而不是基本列。
最后,回答你的問題(我假設你想找到至少有一種用戶語言的用戶,其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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.