Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当属性名称包含前面的单个字母时,JPA存储库方法不会对属性名称进行去资本化_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 当属性名称包含前面的单个字母时,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

我们在创建一些遵循JPA命名约定的JPA存储库方法时遇到了一个问题。 我们的实体是

@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方法。