Bas*_*der 3 java hibernate criteria filter restrictions
我想通过内容搜索实体中的属性
我有一个简单的类来定义用户:
@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>();
}
Run Code Online (Sandbox Code Playgroud)
用户可以使用多种语言,这是用于在用户和语言之间建立链接的类.
@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;
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个搜索对象:
public class UserFilter {
private String name;
private List<Language> languages;
}
Run Code Online (Sandbox Code Playgroud)
我已定义了一项服务:
@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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何搜索语言.我想找到所有使用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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9354 次 |
| 最近记录: |