Java 当属性名称包含前面的单个字母时,JPA存储库方法不会对属性名称进行去资本化
我们在创建一些遵循JPA命名约定的JPA存储库方法时遇到了一个问题。 我们的实体是Java 当属性名称包含前面的单个字母时,JPA存储库方法不会对属性名称进行去资本化,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我们在创建一些遵循JPA命名约定的JPA存储库方法时遇到了一个问题。 我们的实体是 @Entity(name = "regcmp_document") @Table(name = "regcmp_document") @NamedQuery(name = "RegcmpDocument.findAll", query = "SELECT r FROM regcmp_document r") public class
@Entity(name = "regcmp_document")
@Table(name = "regcmp_document")
@NamedQuery(name = "RegcmpDocument.findAll", query = "SELECT r FROM regcmp_document r")
public class RegcmpDocument implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "i_regcmpdoc_id")
private Long iRegcmpdocId;
@Column(name = "i_regsec_id")
private String iRegsecId;
public Long getIRegcmpdocId() {
return this.iRegcmpdocId;
}
public void setIRegcmpdocId(Long iRegcmpdocId) {
this.iRegcmpdocId = iRegcmpdocId;
}
public String getIRegsecId() {
return this.iRegsecId;
}
public void setIRegsecId(String iRegsecId) {
this.iRegsecId = iRegsecId;
}
}
我们正在尝试创建的存储库是
@Repository
public interface RegcmpDocumentRepository extends JpaRepository<RegcmpDocument, Long> {
RegcmpDocument findByiRegcmpdocIdAndIRegsecId(Long regcmpdocId, String iRegsecId);
}
@存储库
公共接口regcmpdocomentrepository扩展了JpaRepository{
RegcmpDocument findbyiregcmpdocandiregsecid(长regcmpdocId,字符串iRegsecId);
}
问题是,项目中的所有列(包括这两个列)以及所有属性都是通过自动工具生成的,该工具为它们指定了此类名称(在数据库列名之后)。
我们在jpa验证后得到的错误是
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [IRegsecId] on this ManagedType [gr.neurosoft.factoring.entities.RegcmpDocument]
at org.hibernate.metamodel.model.domain.internal.AbstractManagedType.checkNotNull(AbstractManagedType.java:147)
at org.hibernate.metamodel.model.domain.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:118)
at org.hibernate.metamodel.model.domain.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:43)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:635)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:619)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:385)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:308)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:211)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.and(JpaQueryCreator.java:133)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.and(JpaQueryCreator.java:59)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:122)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:217)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:348)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:91)
原因:java.lang.IllegalArgumentException:无法在此ManagedType[gr.neurosoft.factoring.entities.RegcmpDocument]上找到具有给定名称[IRegsecId]的属性
位于org.hibernate.metamodel.model.domain.internal.AbstractManagedType.checkNotNull(AbstractManagedType.java:147)
位于org.hibernate.metamodel.model.domain.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:118)
位于org.hibernate.metamodel.model.domain.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:43)
位于org.springframework.data.jpa.repository.query.QueryUtils.toexpressionrecursive(QueryUtils.java:635)
位于org.springframework.data.jpa.repository.query.QueryUtils.toexpressionrecursive(QueryUtils.java:619)
位于org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:385)
位于org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:308)
位于org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:211)
位于org.springframework.data.jpa.repository.query.JpaQueryCreator.and(JpaQueryCreator.java:133)
位于org.springframework.data.jpa.repository.query.JpaQueryCreator.and(JpaQueryCreator.java:59)
位于org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:122)
位于org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95)
位于org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81)
位于org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer(PartTreeJpaQuery.java:217)
位于org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer(PartTreeJpaQuery.java:348)
位于org.springframework.data.jpa.repository.query.PartTreeJpaQuery(PartTreeJpaQuery.java:91)
经过一些调查,我意识到使用了Java.Bean.Introspector的去首字母化,当属性的前两个字母是大写时,它会按原样返回名称
我的问题是,我们是否可以以某种方式覆盖此方法并提示JPA使用自定义方法?
如果没有,我们可以配置jpa以不同方式处理这些列吗
非常感谢您的帮助方法名称可能需要为:findByiRegcmpdocIdAndiRegsecId。为什么不拼出iRegcmpdocId和iRegsecId的真正含义?@AndrewS或查看日志以查看列映射的名称。首先最好删除
findbyiregcmpdocandiregsecid
thoughYep,即使模式是自动生成的,但这并不意味着您的java代码必须遵循。您可以执行类似于@Column(name=“i_regsec_id”)的私有字符串regSecId
@AndrewS谢谢你的评论,findByiRegcmpdocIdAndiRegsecId也不起作用。JPA认为“和”是一个属性。是的,你是对的,这些应该写不同于开始,但现在整个项目我喜欢这样。我正在寻找一种不重写所有内容的方法entities@lane.maxwell谢谢你的评论。是的,如果我没有找到任何其他解决方案,这就是我计划要做的。所有实体从一开始就应该以这种方式编写。无论哪种方式,在这样做之前,我仍然在搜索重写/自定义Java.beans.Introspector的decapitalize方法。