【问题标题】:JPA composite PK is not working with 'finder' in play frameworkJPA 复合 PK 不适用于游戏框架中的“finder”
【发布时间】:2012-07-19 08:35:36
【问题描述】:

我有一个名为“UserRoleHolder”的模型,如下所示。

@Entity
public class UserRoleHolder extends Model implements RoleHolder {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    public UserRoleHolderPK userRoleHolderPK;
    public List<UserPermission> permissions;
    public List<UserRole> roles;
    ....

我制作了一个名为 UserRoleHolderPK 的复合 PK,它包含两个外键,如下所示。

@Embeddable
public class UserRoleHolderPK {
    @Basic
    public Long userId;
    @Basic
    public Long projectId;

    public UserRoleHolderPK(Long userId, Long projectId) {
        this.userId = userId;
        this.projectId = projectId;
    }

    public boolean equals(Object object) {
        if (object instanceof UserRoleHolderPK) {
            UserRoleHolderPK userRoleHolderPK = (UserRoleHolderPK) object;
            return userId == userRoleHolderPK.userId && projectId == userRoleHolderPK.projectId;
        } else {
            return false;
        }
    }

    public int hashCode() {
        return (int) (userId + projectId);
    }
}

userId 和 projectId 来自其他模型。 (User.java 和 Project.java) 然后,在“UserRoleHolder”类中,我创建了一个名为“findRolesById”的方法,如下所示。

public static List<? extends Role> findRolesById(Long userId, Long projectId) {
    return find
            .where()
            .eq("userRoleHolderPK", new UserRoleHolderPK(userId, projectId))
            .findUnique().roles;
}

但是,当我尝试运行如下所示的测试代码时,遇到了严重错误。

@Test
public void findRolesById() {
    // Given
    // When
    @SuppressWarnings("unchecked")
    List<UserRole> list = (List<UserRole>) UserRoleHolder.findRolesById(1l, 1l);
    // Then
    assertThat(list.get(0).name).isEqualTo("manager");
}

错误就像,

'SQL语句中的语法错误“SELECT T0.USER_ID C0, T0.PROJECT_ID C1 FROM USER_ROLE_HOLDER T0 WHERE T0.NULL[*] = ?”;预期的“标识符”; SQL语句:select t0.user_id c0, t0.project_id c1 from user_role_holder t0 where t0.null = ? [42001-158] 绑定值:[null] 查询是: select t0.user_id c0, t0.project_id c1 from user_role_holder t0 where t0.null = ?

我想我在使用 JPA 时遗漏了一些严肃和基本的东西。请让我知道是什么问题。

【问题讨论】:

  • 您是否尝试过实际比较列而不是整个嵌入的 id?像这样:.eq("userRoleHolderPK.userId", userId)

标签: jpa playframework-2.0 composite-key


【解决方案1】:

我认为您的问题是您正在尝试比较 Embeddedid 对象而不是其字段,我认为该程序不会足够聪明,无法知道如何将用户对象比较(等于)转换为 sql ,所以你可能想尝试这样的事情:

public static List<? extends Role> findRolesById(Long userId, Long projectId) {
    return find
            .where()
            .eq("userRoleHolderPK.userId", userId)
            .eq("userRoleHolderPK.projectId", projectId)
            .findUnique().roles;
}

【讨论】:

  • 谢谢。我退出了这个项目,所以我无法测试你的答案。无论如何,我认为您的回答非常合理,我有一天会尝试一下..也许很快。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多