Spring JPA Repository 生成不正确的 SQL

Posted

技术标签:

【中文标题】Spring JPA Repository 生成不正确的 SQL【英文标题】:Spring JPA Repository generating incorrect SQL 【发布时间】:2016-02-02 09:01:41 【问题描述】:

我正在使用 Spring JPA 存储库和下面的 Hibernate 来访问 mysql 数据库。在那个环境中,我有以下实体:

@Entity
@Table(name="cod__postales")
public class CodigoPostal 

    @Id
    @GeneratedValue
    private Long registro;

    @Column(name = "`POST_Nº_CODIGO`", length = 6, nullable = false)
    private String codigo = "  ";

    @Column(name = "POST_DESCRIP", length = 30, nullable = false)
    private String descripcion = "                              ";

    @Column(name = "POST_ZONA_ASIG", length = 2, nullable = false)
    private String zona = "  ";

我还有以下 Spring JPA 存储库:

public interface CodigoPostalRepository extends JpaRepository<CodigoPostal, Long> 

    CodigoPostal findOneByCodigo(String codigo);


如您所见,第一列名称“º”上有一个特殊字符。问题在于,当我调用 repo.findOneByCodigo() 方法时,会生成以下 SQL

select codigopost0_.registro as registro1_2_,
    codigopost0_.`post_nº_codigo` as post_nº_2_2_,
    codigopost0_.post_descrip as post_des3_2_,
    codigopost0_.post_zona_asig as post_zon4_2_
from cod__postales codigopost0_
where codigopost0_.`post_nº_codigo`=?

问题是由于名称 spring/hibernate assing 到该列,sql 给出了错误:as post_nº_2_2_

我怎样才能避免这种情况?

【问题讨论】:

并没有真正帮助您(除非您愿意更改您的 JPA 提供程序),但我使用的实现(DataNucleus)在 select 子句中使用非标准字符的那种查询上运行良好(它不会将这些不必要的别名放在其生成的 SQL 中) 【参考方案1】:

这是关于此查询的第一个想法,我的建议是引入一个本机查询,它可以帮助您将“as post_nº_2_2_.”更改为:“as post_n_2_2_.'。

示例:

@Query(value = " select codigopost0_.registro as registro1_2_,
    codigopost0_.`post_nº_codigo` as post_n_2_2_,
    codigopost0_.post_descrip as post_des3_2_,
    codigopost0_.post_zona_asig as post_zon4_2_
from cod__postales codigopost0_
where codigopost0_.`post_nº_codigo`=?", nativeQuery = true)
public interface CodigoPostalRepository extends JpaRepository<CodigoPostal, Long> 

    CodigoPostal findOneByCodigo(String codigo);


有关此link 的更多信息。

【讨论】:

【参考方案2】:

最后我已经能够通过将 characterEncoding 参数添加到 url 字符串来解决这个问题:

spring.datasource.url=jdbc:mysql://localhost/madr?characterEncoding=UTF-8

无论如何,我已经向 Hibernate 提出了一个问题,因为这对每个人来说可能不是一个有效的选项https://hibernate.atlassian.net/browse/HHH-10493

【讨论】:

【参考方案3】:

改变

@Column(name = "`POST_Nº_CODIGO`", length = 6, nullable = false)

@Column(name = "`POST_N_CODIGO`", length = 6, nullable = false)

【讨论】:

我只是在检查同样的事情。是否有必要避免'º'? 它不起作用。 POST_N_CODIGO 列不存在,Hibernate 引发异常:o.h.engine.jdbc.spi.SqlExceptionHelper:“字段列表”中的未知列“post_n_codigo” 您必须重新创建数据库才能获取新列 这是一个旧数据库。该解决方案不可行。

以上是关于Spring JPA Repository 生成不正确的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA Custom Repository

spring-data-jpa Repository的基本知识

Spring JPA Repository findAll 在 JUnit 测试中不返回任何数据

Spring Data JPA Repository:如何有条件地获取子实体

spring data实现自定义的repository实现类,实现跟jpa联通

EAGER 和分页:Spring MVC + JPA Repository + Hibernate