我正在使用带有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}对象persist
或merge
时,我成功使用以下内容:
@Column(insertable=false, updatable=false)
private BigDecimal distance;
问题:
在执行非本机查询DISTANCE
时,如何让Hibernate忽略select
? (当它更新RATING
表)
更新
我被建议可能使用@Formula("...")
,但我的方法有一个非常复杂的nativeQuery
,它也按distance
排序。如果我将公式放入@Formula("...")
,它还需要接收当前传递给方法的参数。
有什么想法吗?
答案 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;