1

私のプロジェクトでは、エンティティの次の構造。

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 を使用する唯一の解決策は?

4

1 に答える 1

1

見てみましょう: http://docs.oracle.com/javaee/5/api/javax/persistence/IdClass.html

The names of the fields or properties in the primary key class and the primary key fields or properties of the entity must correspond and their types must be the same

ここではそうではありません。型が異なります。

于 2013-03-01T13:19:03.687 に答える