2017-11-14 13 views
2

異なるオブジェクトまたはエンティティ生成する:それは正常に動作しますシングル春のリポジトリは、私は私の春のプロジェクトにリポジトリを持って

@Repository 
public interface UserRepository extends JpaRepository<User, Long> { 

    boolean existsById(long id); 

    List<User> findAllByEmail(String email); 

} 

をしかしLightUser

public class LightUser implements Identifiable<Long>, Auditable { 

    @Id 
    @Column 
    private Long id; 

    @Enumerated(EnumType.STRING) 
    @Column(nullable = false, updatable = false) 
    private UserType userType; 

    @Column(nullable = false, unique = true) 
    private String email; 

    @Column(nullable = false) 
    private String domain; 

    // get/set methods/ equals/hashcode 
} 

LightUserエンティティは、いくつかのフィールドが含まれて使用する必要が現れI一般的には(すべてのフィールドがUserエンティティの前にある)フィールドが必要です。リポジトリマッピング結果をLightUserにすると、DBへのリクエストが必要になります(これはdtoにマップするのが良いでしょう)。

UserRepositoryに私のニーズをカバーする特別な方法を追加することは可能でしょうか、同じテーブルのために同様のものを作成する必要がありますか?LightUser?可能であれば、例を挙げてください。

答えて

2

のように別々のリポジトリLightUserRepositoryを作成するには、まず、あなたはそれが冗長なので、あなたのインターフェースから@Repository注釈を削除する必要があります。

そして、はい、次の2つの方法使用してLightUserに選択することができます。

1)あなたが必要な特性を持つ投影を作成する必要が投影

interface LightUser { 
    Long getId(); 
    String getEmail(); 
} 

をし、適切な選択方法を追加します。

@Query("SELECT u.id AS id, u.email AS email FROM User u WHERE u.id = :id") 
LightUser findLightUser(@Param("id") String id) 

この方法の欠点は、あなたのpr

class LightUser { 
    private Long id; 
    private String email; 

    public LightUser(Long id, String email) { 
     this.id = id; 
     this.email = email; 
    } 

    // getters and setters 
} 
を:ojectionはあなたのDTOは、インスタンス、idとeメールのために、必要なフィールドを持つコンストラクタを持たなければならないインタフェース(あなたはRESTのためにこれを使用する場合は、それはOKです)

2)DTO

する必要があります

その後、あなたはこのDTOための選択を書くことができます:

@Query("SELECT new com.test.LightUser(u.id, u.email) FROM User u WHERE u.id = :id") 
LightUser findLightUser(@Param("id") String id) 

あなたLightUserがDTOのよ​​うなものですので、あなたは第二の方法を使用する必要があります。

2

UserRepositoryは、その定義UserRepository extends JpaRepository<User, Long>で述べたようにUserエンティティを管理するJPAリポジトリです。新しいエンティティの

LightUserすべてのその優れたそう

@Repository 
public interface LightUserRepository extends JpaRepository<LightUser, Long> { 

    .... 

} 
関連する問題