spring-boot - 为什么得到 org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!加入 3 个表时
问题描述
我有三个实体基本信息,性别和部门。如果我加入 basicInfo 和性别模型,那么它工作正常,但是当想要同时加入部门和其他两个实体时,然后显示
.QuerySyntaxException:连接的预期路径!
我这里的三个实体类,
@Entity
@Table(name = "employeebasicinfo")
public class BasicInfoModel {
@Id private String employeeId;
@NotBlank private String firstName;
@NotBlank private String lastName;
@NotNull private Integer companyId;
@Transient private String companyName;
private String phoneNo;
@Column(name = "sex")
private char sexId;
@Transient private String sexName;
@Temporal(TemporalType.TIMESTAMP)
private Date birthDate;
@Temporal(TemporalType.TIMESTAMP)
private Date joiningDate;
@NotNull private Integer department;
@Transient private String departmentName;
@ManyToOne()
@JoinColumn(name = "sex", referencedColumnName = "id", insertable = false, updatable = false)
private GenderModel genderModel;
@ManyToOne
@JoinColumn(
name = "department",
referencedColumnName = "id",
insertable = false,
updatable = false)
private DepartmentModel departmentModel;
// getter setter
}
性别模型
@Entity
@Table(name = "gender")
public class GenderModel implements Serializable {
@Id
@Column(name = "id")
private char id;
@Column(name = "name")
private String name;
//getter setter
}
和部门模型
@Entity
@Table(name = "department")
public class DepartmentModel {
@Id private int id;
private String name;
//getter setter
}
我的 Dto 课
public class BasicInfoDto {
private String employeeId;
private String firstName;
private String lastName;
private Integer companyId;
private String companyName;
private String phoneNo;
private char sexId;
private String sexName;
private Date birthDate;
private Date joiningDate;
private Integer department;
private String departmentName;
public BasicInfoDto(char sexId, String sexName, int department, String departmentName) {
this.sexId = sexId;
this.sexName = sexName;
this.department = department;
this.departmentName = departmentName;
//getter setter
}
我的存储库类如下:
@Repository
public interface BasicInfoRepository extends JpaRepository<BasicInfoModel, String> {
@Query(
value =
"SELECT new com.employeeAttendance.employeeAttendance.dto.BasicInfoDto ("
+ " a.sexId, b.name, a.department,c.name) FROM "
+ " BasicInfoModel a INNER JOIN GenderModel b on a.sexId = b.id" +
" INNER JOIN DepartmentMode c on a.department = c.id")
List<BasicInfoDto> getBasicInfoList();
}
最后我得到了这个错误
原因:java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 路径期望加入![SELECT new com.employeeAttendance.employeeAttendance.dto.BasicInfoDto (a.sexId, b.name, a.department,c.name) FROM com.employeeAttendance.employeeAttendance.model.BasicInfoModel 一个 INNER JOIN com.employeeAttendance.employeeAttendance.model。 a.sexId 上的 GenderModel b = b.id INNER JOIN DepartmentMode c on a.department = c.id] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.3.7. Final.jar:5.3.7.Final] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org. hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java: 调用(ExtendedEntityManagerCreator.java:350) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE] at com.sun.proxy.$Proxy109.createQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) ~[spring-data-jpa-2.1.4.RELEASE.jar:2.1.4.RELEASE] ... 76个常用框架省略引起:org.hibernate.hql.internal.ast.QuerySyntaxException:加入路径预期![SELECT new com.employeeAttendance.employeeAttendance.dto.BasicInfoDto (a.sexId, b.name, a.department,c.name) FROM com.employeeAttendance.employeeAttendance.model.BasicInfoModel 一个 INNER JOIN com.employeeAttendance.employeeAttendance.model。 a.sexId 上的 GenderModel b = b.id INNER JOIN DepartmentMode c on a.department = c.id] at org.hibernate.hql.internal.ast.QuerySyntaxException。
但是,如果我删除与部门的第二次加入,那么它工作正常。
解决方案
您正在处理 jpql 中的实体属性而不是表。所以你只告诉 jpql 使用哪个属性来加入:
"SELECT new com.employeeAttendance.employeeAttendance.dto.BasicInfoDto ("
+ " a.sexId, b.name, a.department,c.name) FROM "
+ " BasicInfoModel a INNER JOIN a.genderModel b "
+ " INNER JOIN a.departmentModel c";
推荐阅读
- android - Parse (Back4app) 使用什么样的令牌?
- reactjs - 如何用 jest 模拟第三方 react-native 组件?
- c++ - Boost 安装:缺少参数 global-setup
- c# - 为什么将 Handles.ArrowHandleCap 添加到一条线时,它没有绘制 ArrowHandleCap?
- python - 我的敌人被冻结在半空中,一动不动
- python - 如何在 Python 类中正确使用泛型
- python - 使用 -argparse 指定参数时运行特定函数
- java - 在 Maven 依赖项中覆盖时覆盖 Spring Security 配置(HttpSecurity)
- python - 打印选择的 scipy.optimize.minimize 方法
- django - int() 参数必须是字符串、类似字节的对象或数字,而不是“列表”:Django 保存模型