在投射到课堂时,使用@Query的预测不能按预期工作

时间:2018-01-14 12:08:05

标签: java spring hibernate spring-data-jpa jpql

当投影到界面时,一切似乎正常工作,正确映射字段。当我尝试投影到一个类(使用兼容的构造函数)时,一切正常。当我使用@Query注释时,我得到以下异常:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.HashMap<?, ?>] to type [com.example.PersonSummary]

// works
PersonSummary findPersonSummaryById(long id);

// doesn't work
@Query("SELECT name AS name, age AS age FROM Person WHERE id = :id")
PersonSummary findPersonSummaryByIdQuery(@Param("id") long id);

参见示例项目:https://github.com/roberthunt/spring-data-query-projection

请参阅Spring Data Bug:Spring Data JPA / DATAJPA-1003

2 个答案:

答案 0 :(得分:2)

由于Spring Data错误尚未解决,您应该能够通过在查询声明中使用构造函数表达式解决此问题,即

@Query("select new com.example.PersonSummary(name, age) …")

答案 1 :(得分:0)

你可以强迫&#34;通过创建一个接受HashMap<?, ?>并调用Spring bean映射器的构造函数来进行spring投影:

public PersonSummary(HashMap<?, ?> resultMap) {
    BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(this);
    wrapper.setPropertyValues(resultMap);
}

请注意,DB返回的列必须与您的类的字段名称匹配,包括正确的大小写。因此,例如在使用Postresql时,您可能需要使用适当的大小写创建带引号的别名,例如:

@Query("SELECT p.firstname as \"firstName\" from person p where ....", nativeQuery = true)