Spring Data JPA、CrudRepositoryインターフェースで@EntityGraphをパラメーター化

アンドレアス・ゲレバー

Spring Data JPAでsmthを実行することは可能ですか?このような:

public interface UserDao extends CrudRepository<User, Long> {

@EntityGraph(value = :graphName, type = EntityGraph.EntityGraphType.LOAD)
    @Query(value = "SELECT DISTINCT u FROM User u")
    List<User> findAllWithDetailsByGraphName(@Param(value="graphName") String graphName);

}

実行時にgraphNameをメソッドに渡し、必要なコレクションのセットを使用してロードを呼び出すことができるようにするには?この構造は機能せず、コンパイル時エラーが発生します。その周りのプレイも失敗しました...

したがって、Userクラスに複数のコレクションがあり、条件付きでロードしたいと思います。

@Entity
@Table(name="user")
@NamedEntityGraphs({
        @NamedEntityGraph(name = "User.details", attributeNodes = {
                @NamedAttributeNode("phones"), @NamedAttributeNode("emails"), @NamedAttributeNode("pets")}),
        @NamedEntityGraph(name = "User.phones", attributeNodes =
                {@NamedAttributeNode("phones")}),
        @NamedEntityGraph(name = "User.emails", attributeNodes =
                {@NamedAttributeNode("emails")}),
        @NamedEntityGraph(name = "User.pets", attributeNodes =
                {@NamedAttributeNode("pets")})
})
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name="user_id")
    private Long userId;

    @Column(name="name")
    private String name;

// more fields omitted

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Phone> phones;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Email> emails;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Pet> pets;
}

ここで、次のように、すべてのメソッドを暗黙的に宣言するだけで済みます。

@EntityGraph(value = "User.phones", type = EntityGraph.EntityGraphType.LOAD)
@Query(value = "SELECT DISTINCT u FROM User u")
List<User> findAllWithPhones();

提案をありがとう!

Markus Pscheidt

エンティティグラフをパラメータとして受け入れるベースJPAリポジトリを定義できます。これは、Specificationsと組み合わせて特に役立ちます。したがって、ここではSpecificationsに基づく例を示します。さまざまなタイプの引数を使用して、他のクエリを作成することもできます。

@NoRepositoryBean
public interface MyBaseRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {

    T findOne(Specification<T> spec, EntityGraphType entityGraphType, String entityGraphName);

    List<T> findAll(Specification<T> spec, Sort sort, EntityGraphType entityGraphType, String entityGraphName);

}

ベースリポジトリを実装します。

@NoRepositoryBean
public class MyBaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyBaseRepository<T, ID> {

    private EntityManager em;

    public MyBaseRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.em = entityManager;
    }

    public MyBaseRepositoryImpl(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
        this.em = em;
    }

    @Override
    public T findOne(Specification<T> spec, EntityGraph.EntityGraphType entityGraphType, String entityGraphName) {
        TypedQuery<T> query = getQuery(spec, (Sort) null);
        query.setHint(entityGraphType.getKey(), em.getEntityGraph(entityGraphName));
        return query.getSingleResult();
    }

    @Override
    public List<T> findAll(Specification<T> spec, Sort sort, EntityGraph.EntityGraphType entityGraphType, String entityGraphName) {
        TypedQuery<T> query = getQuery(spec, sort);
        query.setHint(entityGraphType.getKey(), em.getEntityGraph(entityGraphName));
        return query.getResultList();
    }

}

カスタムベースリポジトリを指定します。

<jpa:repositories base-package="my.domain" base-class="my.repository.MyBaseRepositoryImpl" />

カスタムベースリポジトリから拡張:

public interface UserRepository extends JpaRepository<User, Long>, MyBaseRepository<User, Long>, JpaSpecificationExecutor<User> {
}

カスタムリポジトリの方法を使用します。

Specification mySpecs = ...
List<User> user = picklistRepository.findAll(mySpecs, EntityGraphType.LOAD, "User.phones");

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?

分類Dev

Spring Data JPA @NoRepositoryBeanインターフェースを理解する

分類Dev

Spring Data JDBCとCrudRepositoryインターフェイスを使用した複数のデータソース

分類Dev

Spring Data JPA-インターフェイスベースの投影でのカスタムタイプ変換

分類Dev

Spring Data JPAでパラメーターを自動的に変換する

分類Dev

Spring Data JPAを構成できません:指定されたクラスはインターフェースです

分類Dev

Spring Data JPAを構成できません:指定されたクラスはインターフェースです

分類Dev

Spring Data JPA-NUMBER列タイプのnullパラメーターの問題

分類Dev

1つのパラメーターSpring data jpaで多くのアイテムを見つける方法

分類Dev

Spring Data JPA AuditorAwareインターフェースの実装中にgetUserPrincipal()。getUserName()を取得する方法

分類Dev

Spring-Data-JPAのデフォルトメソッドをEntityGraphアノテーションでオーバーライドすると、QueryExceptionが発生します

分類Dev

Spring Data JPAを使用して複数のエンティティークラスを処理する単一のJPAリポジトリーインターフェースを持つことはできますか?

分類Dev

Spring Data JPA無効なpage.sortパラメータ

分類Dev

EntityGraphでのみEntityNotFoundExceptionをスローするSpring Data

分類Dev

Spring Dataリポジトリ:フェッチサイズをパラメータとして設定

分類Dev

Spring Data JPAリポジトリがインターフェースのみを強制するのはなぜですか?

分類Dev

spring-data-jpa:2.xxRELEASEの「#pageable」パラメーターを追加した後、ネイティブクエリがスタックする

分類Dev

Hibernateを使用したSpring Data JPAで、インターフェースプロジェクションがコンストラクタープロジェクションおよびエンティティプロジェクションよりもはるかに遅いのはなぜですか?

分類Dev

Spring Data JDBCカスタムクエリパラメーターコンバーター

分類Dev

Spring Data JPAクエリのパラメーターとしての列名

分類Dev

Spring Data Reactive Mongo:クラスタイプコンバーター

分類Dev

Spring Data JPA:@Queryのプロパティをパラメーターとして使用

分類Dev

Spring DataのJPAリポジトリ、なぜインターフェースサービスとサービス実装が必要なのか

分類Dev

Spring Data JPAでページネーションを使用してプロジェクションインターフェイスを使用するにはどうすればよいですか?

分類Dev

Spring Data JPA仕様、唯一のSQLリクエスト内で@JoinColumnデータをフェッチする方法

分類Dev

Spring Data JPAでカスタム@Queryに可変引数またはIterableパラメータを提供して使用する方法は?

分類Dev

Spring Data:外部クラスの外でリポジトリの内部インターフェイスを使用する方法は?

分類Dev

Spring Data:複数のリポジトリインターフェースを単一の「リポジトリ」サービスクラスに

分類Dev

Spring Data:複数のリポジトリインターフェースを単一の「リポジトリ」サービスクラスに

Related 関連記事

  1. 1

    Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?

  2. 2

    Spring Data JPA @NoRepositoryBeanインターフェースを理解する

  3. 3

    Spring Data JDBCとCrudRepositoryインターフェイスを使用した複数のデータソース

  4. 4

    Spring Data JPA-インターフェイスベースの投影でのカスタムタイプ変換

  5. 5

    Spring Data JPAでパラメーターを自動的に変換する

  6. 6

    Spring Data JPAを構成できません:指定されたクラスはインターフェースです

  7. 7

    Spring Data JPAを構成できません:指定されたクラスはインターフェースです

  8. 8

    Spring Data JPA-NUMBER列タイプのnullパラメーターの問題

  9. 9

    1つのパラメーターSpring data jpaで多くのアイテムを見つける方法

  10. 10

    Spring Data JPA AuditorAwareインターフェースの実装中にgetUserPrincipal()。getUserName()を取得する方法

  11. 11

    Spring-Data-JPAのデフォルトメソッドをEntityGraphアノテーションでオーバーライドすると、QueryExceptionが発生します

  12. 12

    Spring Data JPAを使用して複数のエンティティークラスを処理する単一のJPAリポジトリーインターフェースを持つことはできますか?

  13. 13

    Spring Data JPA無効なpage.sortパラメータ

  14. 14

    EntityGraphでのみEntityNotFoundExceptionをスローするSpring Data

  15. 15

    Spring Dataリポジトリ:フェッチサイズをパラメータとして設定

  16. 16

    Spring Data JPAリポジトリがインターフェースのみを強制するのはなぜですか?

  17. 17

    spring-data-jpa:2.xxRELEASEの「#pageable」パラメーターを追加した後、ネイティブクエリがスタックする

  18. 18

    Hibernateを使用したSpring Data JPAで、インターフェースプロジェクションがコンストラクタープロジェクションおよびエンティティプロジェクションよりもはるかに遅いのはなぜですか?

  19. 19

    Spring Data JDBCカスタムクエリパラメーターコンバーター

  20. 20

    Spring Data JPAクエリのパラメーターとしての列名

  21. 21

    Spring Data Reactive Mongo:クラスタイプコンバーター

  22. 22

    Spring Data JPA:@Queryのプロパティをパラメーターとして使用

  23. 23

    Spring DataのJPAリポジトリ、なぜインターフェースサービスとサービス実装が必要なのか

  24. 24

    Spring Data JPAでページネーションを使用してプロジェクションインターフェイスを使用するにはどうすればよいですか?

  25. 25

    Spring Data JPA仕様、唯一のSQLリクエスト内で@JoinColumnデータをフェッチする方法

  26. 26

    Spring Data JPAでカスタム@Queryに可変引数またはIterableパラメータを提供して使用する方法は?

  27. 27

    Spring Data:外部クラスの外でリポジトリの内部インターフェイスを使用する方法は?

  28. 28

    Spring Data:複数のリポジトリインターフェースを単一の「リポジトリ」サービスクラスに

  29. 29

    Spring Data:複数のリポジトリインターフェースを単一の「リポジトリ」サービスクラスに

ホットタグ

アーカイブ