获取错误无法在类上找到适当的构造函数

Bas*_*sit 21 spring-data-jpa hibernate-4.x jpa-2.1

我试图将本机SQL结果映射到我的POJO.这是配置.我在用春天.

<bean id="ls360Emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
    <property name="dataSource" ref="ls360DataSource" />
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />         
    <property name="packagesToScan" value="abc.xyz"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
            <prop key="hibernate.show_sql">true</prop>              
        </props>        
    </property>
</bean> 
Run Code Online (Sandbox Code Playgroud)

这是我的班级

@SqlResultSetMapping(
    name="courseCompletionMapping", 
    classes = {
        @ConstructorResult(targetClass = CourseCompletion.class,
            columns={
                @ColumnResult(name = "StoreId", type = String.class),
                @ColumnResult(name = "ProductId", type = String.class),
                @ColumnResult(name = "UserName", type = String.class),
                @ColumnResult(name = "Score", type = Integer.class),
                @ColumnResult(name = "CompletionDate", type = Date.class)
             }
        )
    }
) 
@Entity
public class CourseCompletion {
    private String storeId;

    @Id
    private String productId;
    private String userName;
    private int score;
    private Date completionDate;

    public CourseCompletion() {
    }

    public CourseCompletion(String storeId, String productId, String userName, int score, Date completionDate) {
        this.storeId = storeId;
        this.productId = productId;
        this.userName = userName;
        this.score = score;
        this.completionDate = completionDate;
    }

    // getters and setters
Run Code Online (Sandbox Code Playgroud)

我在这里如何称呼它

    Properties coursePropertiesFile = SpringUtil.loadPropertiesFileFromClassPath("course.properties");
    String queryString = coursePropertiesFile.getProperty("course.completion.sql");

    long distributorId = 1;
    String fromDate = "2009-09-22 00:00:00";
    String toDate = "2014-04-11 23:59:59";

     Query query = em.createNativeQuery(queryString, "courseCompletionMapping");

     //Query query = em.createNamedQuery("findAllEmployeeDetails");
     query.setParameter("distributorId", distributorId);
     query.setParameter("fromDate", fromDate);
     query.setParameter("toDate", toDate);

     @SuppressWarnings("unchecked")
     List<CourseCompletion> courseCompletionList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

但是当涉及到线

List<CourseCompletion> courseCompletionList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

Could not locate appropriate constructor on class : mypackage.CourseCompletion
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的查询

select d.DISTRIBUTORCODE AS StoreId, u.USERGUID AS ProductId, u.UserName,
    lcs.HIGHESTPOSTTESTSCORE AS Score, lcs.CompletionDate 
from VU360User u 
inner join learner l on u.ID = l.VU360USER_ID 
inner join LEARNERENROLLMENT le on le.LEARNER_ID = l.ID 
inner join LEARNERCOURSESTATISTICS lcs on lcs.LEARNERENROLLMENT_ID = le.ID 
inner join customer c on c.ID = l.CUSTOMER_ID 
inner join DISTRIBUTOR d on d.ID = c.DISTRIBUTOR_ID 
where d.ID = :distributorId 
and lcs.COMPLETIONDATE is not null 
and (lcs.COMPLETIONDATE between :fromDate and :toDate) 
and lcs.COMPLETED = 1
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

谢谢

Zmi*_*nka 63

发生此异常是因为JPA不会更改从数据库返回的本机查询的列类型.因此,您的类型不匹配.我不知道哪些列会导致你的情况(这取决于DBMS使用)这个问题,但你我会怀疑BigInteger在结果集中,而不是Integer成绩列.要100%确定,请添加断点ConstructorResultColumnProcessor.resolveConstructor(Class targetClass, List<Type> types)并进行调查.找到不匹配项后,请在映射类中更改字段类型.

另一种解决方案是根本不使用@SqlResultSetMapping.由于您的CourseCompletion类是托管实体,因此您应该能够直接将本机查询映射到它.有关更多信息,请参阅此问题.

  • 谢谢 :).我已经解决了这个问题.我调试程序,然后发现得分列是双重类型.然后我只是做了`@ColumnResult(name ="Score",type = Double.class)`并将得分类型改为`Double`. (6认同)
  • 非常感谢 :) 。它有助于调试。在我的情况下,问题是由 java.sql.Timestamp 引起的。Hibernate 正在将日期时间从 microsoft sql 列转换为 java.util.Date。在我将列类型更改为 java.util.Date 后,它得到了解决。 (4认同)
  • 非常感谢 :) .它有助于调试.在我的情况下,问题是由于java.sql.Datetime.Hibernate正在将日期时间从microsoft sql列转换为java.util.Datetime.将列类型更改为java.util.Datetime后,它已解决. (2认同)