MySQLSyntaxErrorException:'字段列表'

时间:2016-08-22 13:35:21

标签: java mysql sql hibernate jpa

我正在使用带有JPA / Hibernate 5.2.1的Java 8和MySQL数据库。

表格

+--------+    +----------------+    +----------+ 
| Rating |    | Rating_Employee|    | Employee |
+--------+    +----------------+    +----------+ 
| ID     |    | RAT_ID         |    | ID       |
| REVIEW |    | EMP_ID         |    +----------+ 
+--------+    +----------------+    

我正在尝试在Rating表格中保存一行,但请获取以下内容:

MySQLSyntaxErrorException: Unknown column 'employee0_.distance' in 'field list'

原因是因为Employee模型对象具有DISTANCE字段,但数据库上没有匹配的列。我需要DISTANCE字段,因为当我在Employee表上执行SELECT时,我会根据DISTANCE的其他列计算nativeQuery。但是,当Hibernate在更新连接表RATING时进行选择时,它希望匹配DISTANCE,这不存在(我得到上述错误)。

当我{Employ}对象persistmerge时,我成功使用以下内容:

@Column(insertable=false, updatable=false)
private BigDecimal distance;

问题:

在执行非本机查询DISTANCE时,如何让Hibernate忽略select? (当它更新RATING表)

更新

我被建议可能使用@Formula("..."),但我的方法有一个非常复杂的nativeQuery,它也按distance排序。如果我将公式放入@Formula("..."),它还需要接收当前传递给方法的参数。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Hibernate只忽略使用@Transient注释的字段。因此,您可以使用此选项来制作字段" distance"不是由hibernate管理的

@Transient
private BigDecimal distance;
来自java doc的

http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

答案 1 :(得分:0)

我的解决方案:

我创建了第二个没有@Transient距离的Employee对象。然后我使用它并将其复制到Employee对象。

List<Employee> employees = new <Employee>ArrayList();
List<EmployeeWithDistance> employeesWD = (List<EmployeeWithDistance>) q.getResultList();
for (EmployeeWithDistance employeeWD : employeesWD) {
    Employee employee = new Employee();
    BeanUtils.copyProperties(employeeWD, employee);
    employees.add(employee);
}
return employees;