簡體   English   中英

休眠標准:按實體中的屬性列表中的內容進行搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM