【问题标题】:JPA column with incorrect underscore下划线不正确的 JPA 列
【发布时间】:2015-04-17 03:32:47
【问题描述】:

我使用 JPA 进行数据库访问,并用正确的名称注释每一列。现在,如果我执行一个查询(例如findAll()),它会返回

Unknown column 'program0_.program_id' in 'field list'

错误信息正确program_id未知,因为真实姓名是programId

模型:程序

  @Entity
  @Table(name = "programs")
  @XmlRootElement
  public class Program implements Serializable {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Basic(optional = false)
          @Column(name = "programId")
          private Long programId;
          @ManyToMany
          @JoinTable(
                  name = "programlabels",
                  joinColumns = {
                    @JoinColumn(name = "program", referencedColumnName = "programId")},
                  inverseJoinColumns = {
                    @JoinColumn(name = "label", referencedColumnName = "labelId")})
          private Collection<Label> labels;
        }

标签

@Entity
@Table(name = "labels")
@XmlRootElement
public class Label implements Serializable {
  @Id
  @Basic(optional = false)
  @NotNull
  @Size(min = 1, max = 100)
  @Column(name = "labelId")
  private String labelId;  
}

查询

select program0_.program_id as program_1_5_, ...

JPA 将“programId”更改为“program_id”是否有原因,或者我缺少任何配置?

谢谢

编辑:抱歉忘记添加查询代码/信息。

我使用 Spring Data 的 JpaRepository 接口并尝试了 findAll() 查询。

@Repository
public interface ProgramRepository extends JpaRepository<Program, Long> {}

【问题讨论】:

  • 我可能是错的,但我认为这对我没有帮助,因为问题是 JPA 使用了错误的列名,无论我在控制台中看到什么。我在两个输出中看到的列名是相同的。
  • 你的问题可能和这个有关:spring-boot-jpa-column-name-annotation-ignored
  • 谢谢,这是同一个问题。我在配置中添加了一个命名策略,现在它可以工作了。如果您想将其添加为答案,您将获得一些无用的互联网积分。

标签: java spring hibernate jpa jdbc


【解决方案1】:

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jpa.hibernate.naming.strategy 不是使用 Hibernate 5 的 Spring JPA 实现支持的属性。

application.properties中使用下面的属性

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

【讨论】:

  • 对我来说,我的实体类中的 cameCase 属性会自动生成以蛇形数据库表中已定义属性的案例列。我也希望它在 DB 列中进行驼峰式映射。这个解决方案对我来说非常有效,没有太多的变化。
  • 这解决了我的 Spring Boot 安全无法登录的问题。谢谢。
【解决方案2】:

spring-boot-jpa-column-name-annotation-ignored 中所述,您的列名正在转换为蛇形大小写。

可能的解决方案:

  • 设置命名策略
  • 在注释中使用小写的列名

【讨论】:

    【解决方案3】:

    能够映射

    @Column(name = "PersonFullName")

    私人字符串 PersonFullName;


    到数据库表列名“PersonFullName”,不带下划线。

    以下内容对我有用。将此添加到应用程序设置中,然后使用@Column 指定模型属性的物理数据库列名称。

    @Column(name = "PersonFullName")

    Application.properties

    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

    【讨论】:

      【解决方案4】:

      在 application.properties 下面使用

      spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-29
        • 2011-10-13
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 1970-01-01
        相关资源
        最近更新 更多