byron1st
byron1st

Reputation: 981

JPA composite PK is not working with 'finder' in play framework

I have a model called 'UserRoleHolder' like below.

@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;
    ....

I made a composite PK called UserRoleHolderPK and it contains two foreign keys like below.

@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 and projectId are from other Models. (User.java and Project.java) Then, in 'UserRoleHolder' class, I made a method called 'findRolesById' like below.

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

However, when I tried to run a test code like below, I encountered serious errors.

@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");
}

Errors are like,

'Syntax error in SQL statement "SELECT T0.USER_ID C0, T0.PROJECT_ID C1 FROM USER_ROLE_HOLDER T0 WHERE T0.NULL[*] = ? "; expected "identifier"; SQL statement: select t0.user_id c0, t0.project_id c1 from user_role_holder t0 where t0.null = ? [42001-158] Bind values:[null] Query was: select t0.user_id c0, t0.project_id c1 from user_role_holder t0 where t0.null = ?

I think I missed some serious and basic stuff when I used JPA. Please, let me know what is the problem.

Upvotes: 2

Views: 517

Answers (1)

Frank Orellana
Frank Orellana

Reputation: 1898

I think your problem is that you are trying to compare the Embeddedid object and not its fields, I don't think that the program will be smart enough as to know how to convert an user object comparison (the equals) to sql, so you might want to try something like this:

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

Upvotes: 1

Related Questions