默认情况下启用SQL模式ONLY_FULL_GROUP_BY。因此,我没有禁用ONLY_FULL_GROUP_BY,而是尝试使用ANY_VALUE(arg)
查询会提取我预期的结果。
我希望将它与Spring Boot CrudRepository一起使用。所以我在 @Query 注释中得到了类似下面的内容(只是一个示例)。我想在复杂查询中使用@Query注释
@Query("select any_value(c.id), c.number, any_value(c.type) from Call c group by c.number")
public List<Call> getCallsByType(Pageable pageable);
但它抛出异常
Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
+-[METHOD_CALL] MethodNode: '('
| +-[METHOD_NAME] IdentNode: 'any_value' {originalText=any_value}
| \-[EXPR_LIST] SqlNode: 'exprList'
怎么做?
答案 0 :(得分:1)
您告诉Spring将该查询视为本机查询。否则,它将尝试根据JPA规范对其进行验证。
尝试:
@Query(value = "select any_value(c.id), c.number, any_value(c.type) from Call c group by c.number"
, nativeQuery = true)
public List<Object[]> getCallsByType(Pageable pageable);
请记住,在这种情况下您不能使用NEW运算符语法,并且您必须将结果作为Object数组处理。
<强>替代地强>
如果你想使用直接将结果映射到POJO类(假设你使用的是JPA 2.1 +):
1)定义映射:
@SqlResultSetMapping(
name="resultMapping",
classes={
@ConstructorResult(
targetClass=ResultClass.class,
columns={
@ColumnResult(name="id"),
@ColumnResult(name="number")
// further mappings ...
}
)
}
)
2)定义原生查询
@NamedNativeQuery(name="getCallsByType"
, query="select any_value(c.id), c.number, any_value(c.type) from Call c group by c.numbe")
3)在没有@Query
注释的CrudRepository中定义此方法:
public List<ResultClass> getCallsByType();