Java Spring数据Jpa存储库-实体列名上的下划线

Java Spring数据Jpa存储库-实体列名上的下划线,java,jpa,spring-data,repository,spring-data-jpa,Java,Jpa,Spring Data,Repository,Spring Data Jpa,我正在SpringWebMVC项目中使用SpringDataJPA。我在使用我的一个实体的存储库时遇到了一个问题。下面您可以看到我的实体、我的存储库和异常 我的实体: @Entity @Table(schema = "mainschema") @XmlRootElement public class Municipalperson implements Serializable { private static final long serialVersionUID = 1L;

我正在SpringWebMVC项目中使用SpringDataJPA。我在使用我的一个实体的存储库时遇到了一个问题。下面您可以看到我的实体、我的存储库和异常

我的实体:

@Entity
@Table(schema = "mainschema")
@XmlRootElement
public class Municipalperson implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(nullable = false)
    private Integer id;

    @Basic(optional = false)
    @Column(name = "municipal_id", nullable = false)
    private Integer municipal_id;

    @Basic(optional = false)
    @Column(nullable = false, length = 60)
    private String firstname;

    public Municipalperson(Integer id, Integer municipal_id, String firstname) {
        this.id = id;
        this.municipal_id = municipal_id;
        this.firstname = firstname;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getMunicipal_id() {
        return municipal_id;
    }

    public void setMunicipal_id(Integer municipal_id) {
        this.municipal_id = municipal_id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
}
我的存储库:

@Repository
public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> {

    List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id);
}
我尝试将
市政id
设置为int,然后设置为
Integer
,并在我的存储库中设置参数
市政id
,但都不起作用。另外,我将存储库重命名为
findByMunicipalidOrderByLastnameDesc
findByMunicipalidOrderByLastnameDesc
,但它也不起作用

最后,我
市政id
重命名为
市政id
(下划线已删除),并重命名了getter/setter和存储库(
findByMunicipalIdOrderByLastnameDesc
),问题得到了解决


我的问题是为什么会发生这种情况?

下划线
\u
是Spring数据查询派生中的保留字符(有关详细信息,请参阅),可能允许手动属性路径描述。因此,您有两种选择:

  • 坚持使用成员变量名的Java命名约定,一切都将按预期工作
  • 通过使用额外的下划线来转义
    ,即将查询方法重命名为
    findByMunicipal\uu idOrderByLastnameDesc(…)

  • 我建议使用前者,因为您不会疏远其他Java开发人员:)。

    我通过将字段重命名为不带下划线的名称来解决此错误

    @Column(name = "municipal_id", nullable = false)
    private Integer municipalId; // <-- field was renamed
    
    @Column(name=“civility_id”,nullable=false)
    
    私有整数市政许可证;// 请将以下属性添加到应用程序.properties文件中:

    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    

    我知道这个问题很久以前就得到了回答,但它可以在将来帮助别人

    根据,下划线是spring用来分隔属性名称的特殊字符。如果您确实想坚持使用snake-case表示法,可以将nativeQuery设置为true并解决此问题:

    @Query(value = "SELECT * FROM municipalperson WHERE municipal_id=?1 ORDER BY last_name DESC", nativeQuery = true)
    List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id);
    
    @Query(value=“SELECT*FROM municipalperson,其中市政id=?1个订单,按姓氏描述”,nativeQuery=true)
    列表findByMunicipal_idOrderByLastnameDesc(国际市政id);
    
    另一种对我有效的方法是用来区分REST请求/响应中使用的字段名和数据库中使用的字段名。 例如:

    @JsonProperty("municipalId")
    private Integer municipal_id;
    

    SpringDataJPA严重依赖Java命名约定。通过在字段和访问器名称中添加下划线,您选择不尊重它们。这就是你被咬的原因。尊重Java命名约定,SpringDataJPA会很高兴,您的代码也会更具可读性。并不是说列可以按照您的需要命名,包括下划线。重要的是你的映射字段名。非常感谢你的评论。我不知道java命名约定。我也发现这对我也有帮助,但这不起作用。双下划线不会改变任何东西。Java JPA对象中的字段只是跟随数据库中字段的名称,显然不遵循Java约定。所以这一定是一个非常常见的用例。双下划线解决方案对我也不起作用,我无法撤消我的向上投票…双下划线对我不起作用,但我也看到了许多向上投票。也许答案可以通过列出这项工作所需的条件来改进,因此那些不适用它的人不要尝试这个解决方案?答案很好。只需使用选项1。人们花了太多的时间在会议上,并为其提供支持,使其变得有用。答案中唯一的问题是提到了选项2,但它不应该出现。选项1有时是不可能的,特别是当您使用的代码应该遵循格式指南,并且验证是作为构建的一部分进行的时候,一些公司的一些代码约定要求您使用带有“\u1”的前缀实例变量将它们与方法局部变量区分开来,避免像这样的习惯用法。myVar=myVar可能会变得难闻。Jagannath的回答涵盖了这些情况。这确实是处理这种情况的最佳方式,应该是公认的答案。我意识到这个答案是在问题和第一个答案出现几年之后,但我发表这篇评论是为了吸引未来游客对这个答案的注意。以这种方式解决问题可以让您以无法控制的方式使用命名字段的数据库,而不偏离java开发人员整个领域普遍接受的编码标准,例如,将下划线完全排除在方法和变量名之外。在不更改数据库和所有映射内容的情况下删除错误的最佳方法。回答第一条评论时,问题不是“如何将带有下划线的db列名映射到Java实体”,而是如何使用带有下划线的实体属性和spring数据。这就是为什么这个答案不被接受的原因。这个答案应该被标记为正确的答案,这是克服问题的一个很小的努力。这很好,不需要其他更改。From::org.hibernate.cfg.ImprovedNamingStrategy是一种改进的命名策略,它更喜欢嵌入下划线而不是混合大小写的名称。
    @JsonProperty("municipalId")
    private Integer municipal_id;