다음과 같이 'UserRoleHolder'라는 모델이 있습니다. JPA 복합 PK가 재생 프레임 워크에서 'finder'와 작동하지 않습니다.
@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;
....
나는 복합 PK가 UserRoleHolderPK라고하고 아래와 같이 두 개의 외부 키를 포함했다.
@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 문
'구문 오류 "? WHERE T0.NULL [*] = T0 USER_ROLE_HOLDER FROM T0.USER_ID C0, C1 T0.PROJECT_ID 선택"과 같다; 예상 "식별자"; SQL 문 : user_role_holder t0에서 t0.user_id c0, t0.project_id c1을 선택하십시오. 여기서 t0.null =? [42001-158] 바인딩 값 : [null] 쿼리 : select t0.user_id c0, t0.project_id c1 from user_role_holder t0 여기서 t0.null =?
JPA를 사용할 때 심각하고 기본적인 것들을 놓친 것 같습니다. 문제가 무엇인지 알려주세요.
전체 내장 된 ID 대신 실제로 열을 비교하려고 했습니까 ?? .eq ("userRoleHolderPK.userId", userId) –