Hibernate / JPAは、エンティティモデルがデータベースの状態と同期していることを保証しようとするため、これはそれほど簡単ではありません。どうやら、データベースとの同期を維持すべきではない可能性が高い予測が必要なようです。本当にこれを行う必要がある場合は、次のクエリを使用できますが、これにより、条件に一致しないコレクション内のサービス要素が削除される可能性があることに注意してください。
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
これは通常、DTOを導入することで処理され、の完璧なユースケースだと思います。 Blaze-Persistenceエンティティビュー 。
ライブラリを作成して、JPAモデルとカスタムインターフェイスまたは抽象クラス定義モデル(ステロイドのSpring Data Projectionsなど)を簡単にマッピングできるようにしました。ターゲット構造(ドメインモデル)を好きなように定義し、JPQL式を介して属性(ゲッター)をエンティティモデルにマッピングするという考え方です。
ユースケースのDTOモデルは、Blaze-PersistenceEntity-Viewsを使用すると次のようになります。
@EntityView(Request.class)
public interface RequestDto {
@IdMapping
Integer getId();
String getStatus();
@Mapping("services[status = :serviceStatus]")
Set<ServiceDto> getServices();
@EntityView(Service.class)
interface ServiceDto {
@IdMapping
Integer getId();
Integer getRequestId();
String getStatus();
}
}
クエリは、エンティティビューをクエリに適用することであり、最も単純なのはIDによるクエリです。
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Spring Data統合により、SpringDataProjectionsのように使用できます。
List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);
最良の部分は、実際に必要な状態のみをフェッチすることです!