3

エンティティ内のプロパティの内容で検索したい

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

ユーザーは複数の言語を持つことができます。これは、ユーザーと言語の間のリンクを作成するためのクラスです。

@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 では機能しません。手伝って頂けますか?

4

1 に答える 1

8

まず、UserLanguagesエンティティに名前を付ける必要がありますUserLanguage。これは、複数の言語ではなく、1 つの言語を表します。

次に、pers_id列はUserエンティティへの外部キーです。したがって、基本的な列ではなく、User エンティティへの ManyToOne 関係としてマップする必要があります。

langISO最後に、あなたの質問に答えるために (コードがリストにあるユーザー言語を少なくとも 1 つ持つユーザーを見つけたいと仮定しますcontents): join を使用する必要があります:

// inner join between User and UserLanguages
criteria.createAlias("languages", "userLanguage"); 
// restriction on the langISO property of UserLanguage
criteria.add(Restrictions.in("userLanguage.langIso", contents));
于 2011-02-23T10:11:45.580 に答える