【问题标题】:MySQLSyntaxErrorException: Unknown column xxx in 'field list'MySQLSyntaxErrorException:“字段列表”中的未知列 xxx
【发布时间】:2016-08-22 13:35:20
【问题描述】:

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

表格:

+--------+    +----------------+    +----------+ 
| 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 时,我会根据带有 nativeQuery 的其他列计算 DISTANCE。但是,当 Hibernate 在更新连接表 RATING 时自行选择时,它想要匹配不存在的 DISTANCE(我收到上述错误)。

当我persistmerge Employee 对象时,我使用以下成功:

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

问题:

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

更新

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

有什么想法吗?

【问题讨论】:

  • 您可以使用 Hibernate @Formula 列通过原生 SQL 查询检索距离:stackoverflow.com/questions/2986318/…
  • 谢谢艾伦,我去看看。
  • 嗨艾伦,我使用@Formula 的问题是我需要按distance 排序结果集。我无法检索它,并在 java 中对其进行排序,因为我一次只能获得有限数量的行。你有什么想法?是否可以order by@Formula 列?
  • 是否可以在运行时通过反射动态切换字段@Transient?他的任何人都有Javassist 的经验吗?
  • Javassist 对我不起作用,因为在运行时,我必须创建一个新的类加载器来获得它的效果。

标签: java mysql sql hibernate jpa


【解决方案1】:

Hibernate 仅忽略带有 @Transient 注释的字段。因此,您可以使用此选项使字段“距离”不由休眠管理

@Transient
private BigDecimal distance;

来自 java 文档: http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

【讨论】:

  • 嗨,SEY_91,谢谢,@Transient 通常可以工作,但我需要动态执行此操作。当我在 Emplyee 表上执行 select (nativeQuery) 时,我需要 distance 字段。所以我不能只做@Transient
  • 如果您的意思是“仅本地查询的距离字段”,您希望在休眠创建架构时创建“距离列”,之后它不会被休眠查询映射。那么您可以手动创建“距离”列,因为动态(在运行时忽略特定字段)是不可能的。
  • 是的,我想我要编写一个本机查询来执行 INSERT。
  • 我在使用本机查询时遇到问题,因为保存是在事务中完成的。我无法检索评级id,因为在我需要知道id 是什么时它还没有提交。 (我需要将idinsert 加入连接表)
【解决方案2】:

我的解决方案:

我创建了第二个 Employee 对象,它的距离上没有 @Transient。然后我使用它并将其复制到 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;

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2017-06-27
    • 1970-01-01
    • 2016-10-07
    • 2014-03-19
    • 2014-07-19
    相关资源
    最近更新 更多