我正在实现一个基于两个实体的搜索。
@Entity(name = "user")
public class UserEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(updatable = false, nullable = false)
private String id;
@Column(unique = true, nullable = false)
private String email;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "foo_id", referencedColumnName = "id")
private FooEntity foo;
private UserType type;
}
@Entity(name = "foo")
public class FooEntity {
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(updatable = false, nullable = false)
private String id;
private String identifier;
}
现在,我想根据email adres查找用户,或者根据关系中的标识符查找footentity关系是否存在。并基于userentity中的枚举类型。
我尝试了以下查询:
public static Specification<UserEntity> emailLike(String text) {
return (root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("email"), "%" + text + "%");
}
public static Specification<UserEntity> patientIdentifier(String text) {
return (root, query, criteriaBuilder) -> criteriaBuilder.like(root.join("foo").get("identifier"), "%" + text + "%");
}
public static Specification<UserEntity> userType(UserType type) {
return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("type"), type);
}
final Specification<UserEntity> specification = Specification.where(
UserSpecification.patientIdentifier(text)
.or(UserSpecification.emailLike(text))
).and(
UserSpecification.userType(type)
);
final Page<UserEntity> userEntities = userRepository.findAll(specification, pageable);
现在,当与footentity的关系存在时,这个查询似乎可以工作。当此关系为null时,即使电子邮件和类型匹配,也不会返回任何内容。
有人能帮我吗?
1条答案
按热度按时间ve7v8dk21#
你不应该只是加入,而是左加入或右加入。联接是内部联接,这意味着它只匹配符合联接条件的记录。在sql中,任何等于null的值都是false,所以我认为连接站点中的任何一个都是null,记录不在结果集中。因此,左连接表示,用所有左站点实体进行响应,并仅在右站点存在时匹配右站点,如果不存在,则右站点为null。
所以join应该看起来像
root.join("foo", JoinType.LEFT)
(未测试)