当投影到界面时,一切似乎正常工作,正确映射字段。当我尝试投影到一个类(使用兼容的构造函数)时,一切正常。当我使用@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
答案 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)