2017-07-18 100 views
2

SQL模式ONLY_FULL_GROUP_BY默认情况下处于启用状态。因此,而不是禁用ONLY_FULL_GROUP_BY我试图使用ANY_VALUE(arg)带CRUD存储库的MySql ANY_VALUE()方法

查询获取我预期的结果。

我希望这与Spring Boot CrudRepository一起使用。所以我在@查询注释类似于下面(只是一个示例)。我想用@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

你尝试设置[nativeQuery(https://stackoverflow.com/a/15949012/5594670)为真? – Javvano

+0

@Javvano是的,通过将nativeQuery设置为true可以工作。谢谢 – Rajagopal

+0

'nativeQuery'完全破坏了JPA的目的...加上:本机查询是万恶之源。不要使用它们。永远。 – specializt

回答

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运算符语法,你将不得不处理结果作为对象的数组。

或者

如果你想使用的结果直接映射到一个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)定义在CrudRepository这种方法没有@Query注释:

public List<ResultClass> getCallsByType();