简体   繁体   English

休眠标准:按实体中的属性列表中的内容进行搜索

[英]Hibernate criteria: search by content on a property list in an entity

I want to search by content on a property in an entity 我想通过内容搜索实体中的属性

I have a simple class to define a User: 我有一个简单的类来定义用户:

@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>();
}

A User can have multiple languages, here is the class to make the link between user and a language. 用户可以使用多种语言,这是用于在用户和语言之间建立链接的类。

@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;
}

I have created a object to do search: 我创建了一个搜索对象:

public class UserFilter {    
    private String name;

    private List<Language> languages;
}

I have defined a service: 我已定义了一项服务:

@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);
}

My question is how can I do search on languages. 我的问题是如何搜索语言。 I want to find all users with this or thoses languages defined in the userFilter param. 我想找到所有使用userFilter参数中定义的语言或用户语言的用户。 The part about languages doesn't work in the method findByFilter in the service. 关于语言的部分在服务中的方法findByFilter中不起作用。 Can you help me? 你能帮助我吗?

First of all, the UserLanguages entity should be named UserLanguage : it represents one language, and not several. 首先, UserLanguages实体应该命名为UserLanguage :它代表一种语言,而不是几种语言。

Then, the pers_id column is a foreign key to the User entity. 然后, pers_id列是User实体的外键。 It should thus be mapped as a ManyToOne relationship to the User entity rather than a basic column. 因此,它应该作为ManyToOne关系映射到User实体而不是基本列。

Finally, and to answer your question (I'll assume you want to find the users having at least one user language whose langISO code is in the contents list) : you should use a join : 最后,回答你的问题(我假设你想找到至少有一种用户语言的用户,其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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM