sql >> データベース >  >> RDS >> Mysql

SpringJPA@Queryで完全に一致するレコードをフェッチする方法

    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のように使用できます。 https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

    List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);
    

    最良の部分は、実際に必要な状態のみをフェッチすることです!



    1. コードにポップアップし続けるエラー(接続はすでに開いています)

    2. 2つの可能性のセットで一意の行を選択する

    3. さまざまな国、州、地理的な場所の動的ドロップダウンリスト?

    4. ドラッグアンドドロップした後、SQLiteにRecyclerViewアイテムの新しい位置を保存します