我在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
进行相同的设置,但都不起作用。此外,我将仓库重命名为findByMunicipalidOrderByLastnameDesc
和findByMunicipalIdOrderByLastnameDesc
,但也不起作用。
最后,我将municipal_id
重命名为municipalId
(删除下划线),并将getters/setters和Repository(findByMunicipalIdOrderByLastnameDesc
)重命名,然后问题得到解决**。
我的问题是为什么会这样?
6条答案
按热度按时间dzjeubhm1#
我通过将字段重命名为不带下划线的名称解决了此错误。
swvgeqrz2#
下划线
_
是Spring Data查询派生中的保留字符(有关详细信息,请参阅参考文档),可能允许手动属性路径描述。因此,您有两个选项:1.坚持使用camel-case作为成员变量名的Java命名约定,一切都将按预期工作。
1.使用额外的下划线转义
_
,即将查询方法重命名为findByMunicipal__idOrderByLastnameDesc(…)
。我推荐前者,因为你不会疏远其他Java开发人员:)。
eqfvzcg83#
请在application.properties文件中添加以下属性:
t1rydlwq4#
我知道这个问题很久以前就有了答案,但它可以在未来帮助其他人。
根据文档,下划线是spring用来分隔属性名称的特殊字符。如果你真的想坚持使用snake case表示法,你可以将nativeQuery设置为true并解决这个问题:
koaltpgm5#
另一种对我有效的方法是使用@JsonProperty来区分REST请求/响应中使用的字段名和数据库中使用的字段名。例如:
5lhxktic6#
请参考此处的官方文档