2017-07-18 4 views
2

SQLモードのONLY_FULL_GROUP_BYは、デフォルトで有効です。したがって、ONLY_FULL_GROUP_BYを無効にする代わりに、ANY_VALUE(arg)を使用しようとしています。CRUDリポジトリを使用したMySql ANY_VALUE()メソッド

クエリは私に予想される結果を取得します。

私はこれをSpring Boot CrudRepositoryで使用したいと考えています。だから私は@クエリー注釈の上にそれを持っていた(以下のようなサンプル)。私は、複雑なクエリで

@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); 

を@queryアノテーションを使用したいが、それは例外

それを行うことができますか
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

あなたはtrueに[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演算子の構文を使用することはできませんし、あなたがオブジェクトの配列として結果に対処しなければならないことに注意してください。

また

あなたは(あなたがJPA 2.1 +を使用していると仮定して)しなければならないPOJOクラスに直接結果をマッピング使用する場合:

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(); 
関連する問題