2017-04-10 6 views
0

私はこのようになりますクエリ注釈付き春JPAのレポを持っています。要求されたフィールドタイプに対応するオブジェクトのリスト[]を返します。春JPA返すフィールドだけではなく、実体は

何が起こっているのですか?このような

+2

あなたはMainEntityのe'から電子を選択し '試したことがありますか? –

+0

私はそれについて疑問を抱いていました。私は 'select * ...'と 'select e。*'を試しましたが、どちらも失敗しました。 – NickJ

+1

'SELECT e FROM MainEntity e'は完全なエンティティを返します。フィールドのセットが必要な場合は、[回答](http://stackoverflow.com/a/43331990/1426227)を確認してください。 –

答えて

6

、クエリが投影のリストを返すときJPAはObject[]のリストが返され、それは、エンティティ(または複数のエンティティ)からのフィールドの集合です。

春データJPAを使用すると、Object[]を避けることができますし、次のようなインタフェースを定義することでよりエレガントな形式にデータを返す:

public interface MainEntityProjection { 
    String getStart(); 
    String getFinish(); 
    String getForename(); 
    String getSurname(); 
} 

そして、上記で定義されたインタフェースを返すために、クエリの方法を変更します:

@Query("SELECT e.start, e.finish, e.forename, e.surname " + 
     "FROM MainEntity e " + 
     "WHERE e.volunteerId = :id AND e.areaId > 0 AND e.isAssignment = true " + 
     "ORDER BY e.start") 
List<MainEntityProjection> findAssignments(@Param("id") int volunteerId); 

この方法は、Spring Data JPA documentationに記載されています。


別に春データJPAから、JPA自体がpublicコンストラクタを使用して、SELECT NEWでそれを処理します。 (あなたの方法は、以下のリストを返します上記のクエリはまた、春データJPAで動作するように期待されている

SELECT NEW org.example.MainEntityProjection(e.start, e.finish, e.forename, e.surname) 
FROM MainEntity e 
WHERE e.volunteerId = :id AND e.areaId > 0 AND e.isAssignment = true 
ORDER BY e.start 

public class MainEntityProjection { 

    private String start; 
    private String finish; 
    private String forename; 
    private String surname; 

    public MainEntityProjection(String start, String finish, 
           String forename, String surname) { 
     this.start = start; 
     this.finish = finish; 
     this.forename = forename; 
     this.surname = surname; 
    } 

    // Getters and setters 
} 

など、あなたのクエリは次のようになります。あなたは次のようにクラスを定義しますMainEntityProjection)。何JSR 338

チェックは、JPA 2.1を定義するドキュメントは、SELECT NEWとコンストラクタ式を使用することについて述べている:SELECT句で

4.8.2コンストラクタ式

コンストラクタを使用することができますSELECTのリストでJavaクラスのインスタンスを返します。指定されたクラスは、エンティティまたはデータベースにマップする必要はありません。コンストラクター名は完全修飾名でなければなりません。

SELECT NEW句にコンストラクタ名としてエンティティクラス名が指定されている場合、結果のエンティティインスタンスは、作成されたオブジェクトに対してプライマリキーが取得されるかどうかに応じて、新しい状態またはデタッチ状態になります。

場合single_valued_pa​​th_expressionまたは、コンストラクタへの引数は、エンティティを参照によって参照得エンティティインスタンスであるidentification_variableそのsingle_valued_pa​​th_expression又はidentification_variable管理状態になります。例えば

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) 
FROM Customer c JOIN c.orders o 
WHERE o.count > 100 
0

書き込み:

@Query("from MainEntity e where e.volunteerId= :id " 
     + "and e.areaId>0 and e.isAssignment=true order by e.start") 
+0

あなたはJPQL –

+0

から "SELECT e"を逃してしまったようですが、 "select e"を使わなくても使うことができます。 – coenni

+0

Errm、JPA仕様に準拠していればそれはできません。 –

0

あなたは、エンティティが、それのフィールドを要求しません。一方、オブジェクト配列は返されました。 これを試してください:。定義により

 Select e from MainEntity e ... 
関連する問題