Spring-Data-Jpa Repository -实体列名下划线

ss2ws0br  于 2023-04-21  发布在  Spring
关注(0)|答案(6)|浏览(260)

我在spring webmvc项目中使用spring-data-jpa。我在我的一个实体的仓库上使用查询创建时遇到了一个问题。下面你可以看到我的实体,我的仓库和异常。
我的实体:

@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);
}

和例外

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'municipalpersonRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property municipal found for type Municipalperson!

我尝试将municipal_id设置为int,然后设置为Integer,并对我的仓库上的参数municipal_id进行相同的设置,但都不起作用。此外,我将仓库重命名为findByMunicipalidOrderByLastnameDescfindByMunicipalIdOrderByLastnameDesc,但也不起作用。
最后,我将municipal_id重命名为municipalId(删除下划线),并将getters/setters和Repository(findByMunicipalIdOrderByLastnameDesc)重命名,然后问题得到解决**。
我的问题是为什么会这样?

dzjeubhm

dzjeubhm1#

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

@Column(name = "municipal_id", nullable = false)
private Integer municipalId; // <-- field was renamed
swvgeqrz

swvgeqrz2#

下划线_是Spring Data查询派生中的保留字符(有关详细信息,请参阅参考文档),可能允许手动属性路径描述。因此,您有两个选项:
1.坚持使用camel-case作为成员变量名的Java命名约定,一切都将按预期工作。
1.使用额外的下划线转义_,即将查询方法重命名为findByMunicipal__idOrderByLastnameDesc(…)
我推荐前者,因为你不会疏远其他Java开发人员:)。

eqfvzcg8

eqfvzcg83#

请在application.properties文件中添加以下属性:

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

t1rydlwq4#

我知道这个问题很久以前就有了答案,但它可以在未来帮助其他人。
根据文档,下划线是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);
koaltpgm

koaltpgm5#

另一种对我有效的方法是使用@JsonProperty来区分REST请求/响应中使用的字段名和数据库中使用的字段名。例如:

@JsonProperty("municipalId")
private Integer municipal_id;
5lhxktic

5lhxktic6#

请参考此处的官方文档

  • 由于我们将下划线字符视为保留字符,因此强烈建议遵循标准Java命名约定(即,在属性名中不使用下划线,而是使用驼峰大小写)。

相关问题