JPA 通过 id 而不是实体加入
JPA join by id not entity
我创建了一个条件为 api 的查询,该查询通过另一个链接的实体检索实体:
public List<Booking> getBookingsByUser(User user) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Booking> createQuery = cb.createQuery(Booking.class);
Root<Booking> booking = createQuery.from(Booking.class);
Join<Booking, UsersProjects> join = booking.join(Booking_.userProject, JoinType.INNER);
createQuery.where(cb.equal(join.get(UsersProjects_.user), user));
createQuery.select(booking);
return em.createQuery(createQuery).getResultList();
}
这工作正常。但是如何重写它以通过 userId (Long) 查找实体?
用户的元模型具有 User_.id (SingularAttribute)。
用户也是实体。 "UsersProject" 正好有一个用户和一个项目。
在UserProjects
和User
之间再添加一个连接子句:
Join<Booking, UsersProjects> userProjectsJoin = booking.join(Booking_.userProject, JoinType.INNER);
Join<UsersProjects, User> userJoin = userProjectsJoin.join(UserProjects_.user);
createQuery.where(cb.equal(userJoin.get(User_.id), userId));
我创建了一个条件为 api 的查询,该查询通过另一个链接的实体检索实体:
public List<Booking> getBookingsByUser(User user) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Booking> createQuery = cb.createQuery(Booking.class);
Root<Booking> booking = createQuery.from(Booking.class);
Join<Booking, UsersProjects> join = booking.join(Booking_.userProject, JoinType.INNER);
createQuery.where(cb.equal(join.get(UsersProjects_.user), user));
createQuery.select(booking);
return em.createQuery(createQuery).getResultList();
}
这工作正常。但是如何重写它以通过 userId (Long) 查找实体? 用户的元模型具有 User_.id (SingularAttribute)。
用户也是实体。 "UsersProject" 正好有一个用户和一个项目。
在UserProjects
和User
之间再添加一个连接子句:
Join<Booking, UsersProjects> userProjectsJoin = booking.join(Booking_.userProject, JoinType.INNER);
Join<UsersProjects, User> userJoin = userProjectsJoin.join(UserProjects_.user);
createQuery.where(cb.equal(userJoin.get(User_.id), userId));