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

JpaリポジトリでlighEntityバージョンを実装する方法は?

    Springは、フェッチするデータを制限するために使用できる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
    }
    

    EntityGraphには2つのタイプがあります :

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

    PS: また、レイジーフェッチタイプを設定できることを忘れないでください:@ManyToOne(fetch = FetchType.LAZY) 親がフェッチされているとき、JPAは子エンティティをフェッチしません。




    1. AccessをCRMとして使用する方法

    2. SQLステートメントがJavaで実行されたかどうかを知る方法は?

    3. ストアドプロシージャのもう1つの引数

    4. 列名を指定せずにMySQLを更新する