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 回答