带有CRUD存储库的MySql ANY_VALUE()方法

时间:2017-07-18 13:14:34

标签: mysql spring jpa spring-boot spring-data-jpa

默认情况下启用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'

怎么做?

1 个答案:

答案 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();