我需要创建自定义 Hibernate 查询。
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> user = criteria.from(User.class);
List<Predicate> restrictions = new ArrayList<>();
restrictions.add(builder.equal(user.get("firstname"), user.getFirstName()));
List<User> users = (List<User>) entityManager.createQuery(criteria).getResultList();
我需要添加额外的限制条件。我有额外的模型 Photo
,它使用外键 user_id
连接到模型 User
。
我需要找到有照片的用户。
用户
模型包含:
private List<Photo> photos;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "photo", cascade = CascadeType.ALL)
@Fetch (FetchMode.SELECT)
@JsonIgnore
public List<Photo> getPhotos() {
return photos;
}
照片模型包含:
private User user;
@ManyToOne
@JoinColumn(name="user_id")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
已更新
我需要这样的东西:
restrictions.add(builder.isNotNull(user.get("photos")));
但它不起作用。
问题不在于如何组合 2 个限制,问题在于如何添加限制 isNotNull...用户对照片一无所知。照片了解用户,因为它们有 user_id。
更新2:
org.postgresql.util.PSQLException: ERROR: syntax error at or near "."
SQL:
select * from User user0_ cross join Photo photos1_ where user0_.id=photos1_.user and (. is not null)
我需要遵循 SQL:
SELECT DISTINCT user.* FROM user
LEFT JOIN photo
ON user.id = photo.user_id;
最佳答案
试试这个:
restrictions.add(Restrictions.and(Restrictions.eq(user.get("firstname"), user.getFirstName()),Restrictions.isNotNull(user.get("photos")));
更新:您正在寻找的双向关系是这样的:
照片类别:
@ManyToOne
@JoinColumn(name="user")
private User user;
用户类别:
@OneToMany(mappedBy="user")
private Set<Photo> photos;
在此例中,您可以双向映射,以便您可以访问用户的照片以及从照片访问用户。
关于java - 自定义 hibernate 标准(一对多关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32836826/