Hibernate CriteriaBuilder为使用camelCase编写的属性生成无效查询

时间:2016-09-07 09:11:32

标签: java postgresql hibernate spring-boot hibernate-criteria

我使用Postgres 9.4.1209,Spring Boot 1.4.0和Hibernate 5.0.9并尝试将动态分页查询发送到Spring Data Repository。只要我的模型类具有camelCase中命名的属性,就会导致错误。

Hibernate的QueryTranslatorImpl中生成的HQL是正确的:

select count(payment) from it.my.company.Payment payment where payment.externalId in (?1)

但生成的SQL带有一个额外的下划线,其中我有camelCase属性名称,因此 externalId 变为 external_id

select count(payment0_.id) as col_0_0_ from payment payment0_ where payment0_.external_id in (?)

不出所料,此查询失败,因为我的数据库中没有 external_id 列。

我直接使用了Criteria API,Spring Specification API和QueryDSL Predicates,并且每次都从Hibernate中弹出相同的错误。

作为一种解决方法,我尝试将所有模型类属性重命名为完全小写,从而处理错误。但我不想将我的所有属性重命名为不太可读的样式,因为这个错误= /

以前有人见过这样的事吗?我目前正在通过Hibernate的HqlSqlBaseWalker调试方式,但这不是最易读的代码。

1 个答案:

答案 0 :(得分:1)

我认为问题在于postgresql有自己的命名约定。

例如列名称之类的名称标识符应位于lower_case_with_underscores

关于你的问题,外面有许多激烈的讨论和讨论。

不确定是否存在“真实”的解决方案,但是有一个很好的最佳实践以及如何实现。

以下是一些:

PostgreSQL naming conventions

Underscores or camelCase in PostgreSQL identifiers, when the programming language uses camelCase?

Are PostgreSQL column names case-sensitive?

希望这些答案有所帮助。我还将进一步研究找到“真正的”解决方案的问题。