【发布时间】:2015-04-10 01:31:36
【问题描述】:
将 Spring Data REST 与 JPA/Hibernate 一起使用并通过 REST 公开 spring JpaRepository 时,我收到 JPA Criteria 查询错误。这是一个 Spring Boot 应用程序。
几个相关实体:
@Entity
public class Appointment {
...
...
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="doctor_id", insertable=false, updatable=false)
private Doctor doctor;
...
...
}
@Entity
public class Doctor {
...
...
@Column(name = "doctor_name")
private String doctorName = "";
...
...
}
试图返回与医生姓名匹配的约会列表,我有如下构建的 JPA 规范:
public Specification<Appointment> getSpecification() {
return new Specification<Appointment>() {
Join<Appointment, Doctor> doctorJoin;
@Override
public Predicate toPredicate(Root<Appointment> root,
CriteriaQuery<?> query,
CriteriaBuilder cb) {
Predicate p = cb.conjunction();
... //other critieria
p = addDoctorCriteria(p, cb, root, Doctor_.doctorName, getDoctorName());
return p;
}
private Predicate addDoctorCriteria(Predicate p,
CriteriaBuilder cb, Root<Appointment> root, SingularAttribute<Doctor, String> property, String value) {
value = value + '%';
if (doctorJoin == null) {
doctorJoin = root.join(Appointment_.doctor);
}
p = cb.and(p, cb.like(cb.lower(doctorJoin.<String>get(property)), value));
return p;
}
};
}
这会引发以下异常:
org.hibernate.hql.internal.ast.QuerySyntaxException:
Invalid path: 'generatedAlias1.doctorName'
[select count(generatedAlias0) from my.package.Appointment as generatedAlias0
where ( 1=1 ) and ( lower(generatedAlias1.doctorName) like :param0 )];
看起来连接查询不正确 - from 子句中没有“generatedAlias1”。当 Spring 尝试获取行数以构建分页信息时,似乎正在发生这种情况。其他依赖于 Appointment 属性的标准(即没有加入)效果很好。
我的 JPA 加入是否正确?有关如何纠正此错误的任何建议?
【问题讨论】:
标签: spring-data-jpa spring-data-rest