JPAリポジトリとガーゼエンティティのバージョンを実装する方法?

Valentyn Hruzytskyi:

「フル・エンティティ」クラスを持っています:

@Entity(name = "vacancy_dec_to_words")
public class VacancyDescriptionToWords {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @JoinColumn(name = "vacancy_description_id")
    @ManyToOne(cascade = CascadeType.ALL)
    private VacancyDescription vacancyDescription;

    @JoinColumn(name = "words_id")
    @ManyToOne
    private Words words;

    @Column(name = "qty")
    private int qty;

    @Column(name = "create_date")
    private Date date;

    //...getters and setters

いくつかの方法で、私は、このデータベースからのみ2列を使用する必要が:word_idqty

私は、次の方法を試してみてください。

プロジェクション https://docs.spring.io/spring-data/jpa/docs/2.1.2.RELEASE/reference/html/#projections

public interface QtyWords {
    Long getWords();
    Integer getQty();
}

JpaReposytory:

*クエリに、私はそれが実行可能なテストを使用して、私は彼を使用することJpaRepository

@Repository
public interface SmallVDTWRepository extends JpaRepository<VacancyDescriptionToWords, Long> {

@Query(nativeQuery = true,
        value = "SELECT sum(qty), words_id FROM vacancy_desc_to_words WHERE vacancy_description_id IN (" +
                "SELECT id FROM vacancy_description WHERE vacancy_id IN (" +
                "SELECT id FROM vacancy WHERE explorer_id = :exp))" +
                "GROUP BY words_id")
List<QtyWords> getDistinctWordsByExplorer(@Param("exp") long exp);
}

私は、エンティティのリストを取得する場合でも、私はいくつかの興味深い結果が得られます。

    List<QtyWords> list = vdtwService.getByExplorerId(72);

私はすべての例外を取得していないですが、私は未知のオブジェクトであるとのリストを持っています。このオブジェクトは、私は(私の必要データを含むqtywords_id)が、私は彼からそれらを取得することはできません。

ここでは、画像の説明を入力します。

私は(このメソッドを使用することができProjection、このタスクを実装すると、一般的には、どのように正しくこの場合には「ライトエンティティ」を実装しますか)?

アレクサンドルSemyannikov:

スプリングは、フェッチする制限データに使用することができる2つのメカニズムを提供します。

プロジェクション

予測は、あなたは正確にあなたが取得したい属性をどのように設定することにより、データベースから取得したデータを、減らすのに役立つことができます。

例:

@Entity
class Person {
    @Id UUID id;
    String firstname, lastname;
    @OneToOne
    Address address;
}

@Entity
static class Address {
    @Id UUID id;
    String zipCode, city, street;
}

interface NamesOnly {
    String getFirstname();
    String getLastname();
}

@Repository
interface PersonRepository extends Repository<Person, UUID> {
    Collection<NamesOnly> findByLastname(String lastname);
}

エンティティグラフ

注釈は、EntityGraphあなたが取得するために必要な正確に関連するどのようなエンティティを設定することで、データベースへのクエリの量を減らすためにあなたを助けることができます。

例:

@Entity
@NamedEntityGraph(name = "GroupInfo.detail", attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {
    @Id UUID id;
    @ManyToMany //default fetch mode is lazy.
    List<GroupMember> members = new ArrayList<GroupMember>();
}

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

    @EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
    GroupInfo getByGroupName(String name); //Despite of GroupInfo.members has FetchType = LAZY, it will be fetched because of using EntityGraph
}

の2種類がありますEntityGraph

  1. EntityGraphType.LOAD-エンティティのグラフを指定するために使用され、エンティティグラフの属性ノードによって指定される属性は、として扱われFetchType.EAGER、指定されていない属性は、その指定された又はデフォルトに従って処理されますFetchType
  2. EntityGraphType.FETCH-エンティティのグラフを指定するために使用され、エンティティグラフの属性ノードによって指定される属性は、として扱われFetchType.EAGER、指定されていない属性は、以下のように扱われますFetchType.LAZY

PS: また、あなたは怠け者フェッチタイプを設定することができることを覚えている@ManyToOne(fetch = FetchType.LAZY)と親がフェッチされたときJPAは、子エンティティを取得しません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189518&siteId=1