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

我正在一个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!  

我试图将我的存储库上的参数设置为int,然后设置为as和相同的参数,但没有一个工作。另外,我将存储库重命名为 和,但它也不起作用。municipal_idIntegermunicipal_idfindByMunicipalidOrderByLastnameDescfindByMunicipalIdOrderByLastnameDesc

最后,我将 to 重命名为 (下划线已删除),并重命名 getters/setters 和 Repository (),问题得到了解决municipal_idmunicipalIdfindByMunicipalIdOrderByLastnameDesc

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


答案 1

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

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

答案 2

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

  1. 坚持使用驼峰大小写作为成员变量名称的Java命名约定,一切都将按预期工作。
  2. 通过使用附加的下划线对 进行转义,即将查询方法重命名为 。_findByMunicipal__idOrderByLastnameDesc(…)

我推荐前者,因为你不会疏远java开发人员:)。


推荐