2

我有一个名为“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 时错过了一些严肃和基本的东西。请让我知道是什么问题。

4

1 回答 1

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;
}
于 2012-09-08T05:20:36.993 回答