私のプロジェクトでは、エンティティの次の構造。
public class FriendId {
private String profileFrom;
private String profileTo;
...
}
PK として使用される Friend エンティティの場合 - FriendId。
@Entity
@Table(name = "FRIEND")
@IdClass(FriendId.class)
public class Friend {
@Id
@ManyToOne
@JoinColumn(name = "PROFILE_UUID_1", nullable = false)
private Profile profileFrom;
@Id
@ManyToOne
@JoinColumn(name = "PROFILE_UUID_2", nullable = false)
private Profile profileTo;
...
}
問題は、メソッドに参加できないことfindFriendsByUser
です。
public List<User> findFriendsByUser(String userUuid) {
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
Join<User, Profile> profileJoin = userRoot.join(PROFILES);
Join<Profile, Friend> friendsJoin = profileJoin.join(FRIENDS);
Join<Friend, Profile> profileFriendsJoin = friendsJoin.join(PROFILE_TO);
Join<Profile, User> userFriendsJoin = profileFriendsJoin.join(USER);
Predicate userPredicate = builder.equal(userFriendsJoin.get(UUID), userUuid);
query.select(userRoot).where(userPredicate);
return getEntityManager().createQuery(query).getResultList();
}
私はこの例外をキャッチします:
java.lang.RuntimeException: java.lang.IllegalArgumentException: Unable to resolve attribute [profileTo] against path [null]
アノテーション @Embeddable を使用する唯一の解決策は?