【问题标题】:Query with a list of embedded primary keys使用嵌入式主键列表进行查询
【发布时间】:2018-03-28 16:37:05
【问题描述】:

我正在尝试使用嵌入式主键列表查询对象列表。像这样的:

用户.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="它"
id=2 group="eng"

如何使用复合主键列表查询用户?

【问题讨论】:

  • 可能重复 stackoverflow.com/questions/3126366/… 但除非您提出问题否则很难知道
  • 是的,我知道将 IN 用于单个字段,但不用于嵌入对象。在这种情况下,主键是复合键,所以我不确定是否构建此查询。

标签: java mysql hibernate


【解决方案1】:

您所做的一切都很好,尽管需要对 getUsersById 方法的返回类型进行小幅更正,它应该是 List&lt;User&gt; 而不是 List&lt;Long&gt;

您可以使用 UserPKs 对象列表进行查询,并将其用作 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.iduserPK.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 表中有这些数据。

示例 1:通过 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: 4 | GROUP: eng
ID: 1 | GROUP: it

示例 2:按 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2014-05-18
  • 2022-10-21
相关资源
最近更新 更多