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:如何有条件地获取子实体