私はこのようになりますクエリ注釈付き春JPAのレポを持っています。要求されたフィールドタイプに対応するオブジェクトのリスト[]を返します。春JPA返すフィールドだけではなく、実体は
何が起こっているのですか?このような
私はこのようになりますクエリ注釈付き春JPAのレポを持っています。要求されたフィールドタイプに対応するオブジェクトのリスト[]を返します。春JPA返すフィールドだけではなく、実体は
何が起こっているのですか?このような
、クエリが投影のリストを返すとき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_path_expressionまたは、コンストラクタへの引数は、エンティティを参照によって参照得エンティティインスタンスであるidentification_variableそのsingle_valued_path_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
書き込み:
@Query("from MainEntity e where e.volunteerId= :id "
+ "and e.areaId>0 and e.isAssignment=true order by e.start")
あなたはJPQL –
から "SELECT e"を逃してしまったようですが、 "select e"を使わなくても使うことができます。 – coenni
Errm、JPA仕様に準拠していればそれはできません。 –
あなたは、エンティティが、それのフィールドを要求しません。一方、オブジェクト配列は返されました。 これを試してください:。定義により
Select e from MainEntity e ...
あなたはMainEntityのe'から電子を選択し '試したことがありますか? –
私はそれについて疑問を抱いていました。私は 'select * ...'と 'select e。*'を試しましたが、どちらも失敗しました。 – NickJ
'SELECT e FROM MainEntity e'は完全なエンティティを返します。フィールドのセットが必要な場合は、[回答](http://stackoverflow.com/a/43331990/1426227)を確認してください。 –