使用IdClass连接表

时间:2013-03-01 07:54:58

标签: java hibernate jpa join

在我的项目中,实体的结构如下。

public class FriendId {
    private String profileFrom;
    private String profileTo;
    ...
}

对于用作PK的朋友实体 - 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的唯一解决方案?

1 个答案:

答案 0 :(得分: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

这不是这里的情况,类型不同!