2017-10-17 1 views
0

埋め込みプライマリキーのリストを使用してオブジェクトのリストをクエリしようとしています。このような何か:埋め込みプライマリキーのリストを持つクエリ

User.java

public class User { 
    @EmbeddedId 
    protected UserPK userPK; 

    //getter & setters... 
} 

UserPK.java

@Embeddable 
public class UserPK { 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "group") 
    private String group; 

    //getter & setters... 
} 

UserDao.java

public List<Long> getUsersById(List<UserPK> ids) { 
    TypedQuery<User> q = entityManager.createQuery(
     "SELECT u FROM User AS u WHERE u.userPK IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

基本的に、私は複数のユーザーを照会しています、と言うことができます:

id = 1 group = "it"
id = 2 group = "eng"

複合主キーのリストをユーザーに照会するにはどうすればよいですか?

+1

可能重複https://stackoverflow.com/questions/3126366/doing-an-in-query-with-hibernateしかし、あなたは聞いていない限り知っているが、再びハード質問 –

+0

私はINフィールドを使用しているが、埋め込みオブジェクトは認識していません。この場合、プライマリキーはコンポジットキーなので、このクエリを作成することはできません。 – Rawr

答えて

1

返品の種類がgetUsersByIdの方法で必要な小修正がありますが、List<Long>の代わりにList<User>であるはずですが、あなたがやったことは全く問題ありません。

UserPKオブジェクトのリストを使用してクエリを実行し、それをIN演算子のパラメータとして使用できます。だから、(あなたがやったように)以下のクエリは正常に動作します:

public List<User> getUsersByIdCombo(List<UserPK> ids) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

をまた、明示的に埋め込まれたIDクラス(userPK.idまたはuserPK.group)を横断することにより照会することができます。下記のサンプルがあります。

public List<User> getUsersById(List<Long> ids) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.id IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

public List<User> getUsersByGroup(List<String> groups) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.group IN :groups", User.class); 
    q.setParameter("groups", groups); 
    return q.getResultList(); 
} 

public User getSingleUserByIdAndGroup(Long id, String group) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.id = :id AND u.userPK.group = :group", User.class); 
    q.setParameter("id", id); 
    q.setParameter("group", group); 
    return q.getSingleResult(); 
} 

各メソッドをテストすることで、これらのクエリがどのように動作するかを見てみましょう。このデータがUSERテーブルにあるとします。

enter image description here

例1:

ID: 4 | GROUP: eng 
ID: 1 | GROUP: it 

例2:クエリユーザーUserPKのリストによっては

List<UserPK> userPKs = new ArrayList<UserPK>(); 
    userPKs.add(new UserPK(1L, "it")); 
    userPKs.add(new UserPK(4L, "eng")); 
    List<User> userListQuery1 = userDAO.getUsersByIdCombo(userPKs); 
    for (User user: userListQuery1) { 
     System.out.println(user); 
    } 

結果オブジェクトIDのリストでクエリのユーザーを

List<Long> ids = new ArrayList<Long>(); 
    ids.add(2L); 
    ids.add(5L); 
    List<User> userListQuery2 = userDAO.getUsersById(ids); 
    for (User user: userListQuery2) { 
     System.out.println(user); 
    } 

結果:

ID: 5 | GROUP: eng 
ID: 2 | GROUP: it 

例3:グループのリストによってクエリユーザー

List<String> groups = new ArrayList<String>(); 
    groups.add("it"); 
    groups.add("eng"); 
    List<User> userListQuery3 = userDAO.getUsersByGroup(groups); 
    for (User user: userListQuery3) { 
     System.out.println(user); 
    } 

結果:

ID: 4 | GROUP: eng 
ID: 5 | GROUP: eng 
ID: 1 | GROUP: it 
ID: 2 | GROUP: it 

例4:IDによるクエリシングルユーザグループ別に

User user = userDAO.getSingleUserByIdAndGroup(3L, "hr"); 
    System.out.println(user); 

結果:

ID: 3 | GROUP: hr 
+0

サンプルコードは https://github.com/balagueri21/sample-codes/tree/master/QueryCompositePrimaryKeys – Ish

+0

こちらからご覧ください。ありがとうございます、詳細な回答をいただきありがとうございます。 – Rawr

関連する問題