2017-07-20 18 views
1

私は、コースのセットを含むユーザーがいて、学生が登録されているコースの数を取得する必要があります。私はティをロードしたくありません。これは学生のグラフオブジェクト全体をロードするなど、住所などのようなものがロードされるからです。バネデータjpaを使ってカウントを取得する方法はありますか?質問による春データのjpaカウント

+0

あなたのコースはエンティティですか?それらの間の関係はManytoManyかManytoOneですか?エンティティのコードを投稿して正確な回答を得てください。 – Ranjeet

答えて

1

(コースとしてidと設定プロパティ名としてエンティティ・学生PKを想定)

@Query("select size(s.courses) from Student s where s.id=:id") 
long countCoursesByStudentId(@Param("id") long id); 

また、あなたも、あなたのCourseRepository(学生へのコースのManyToOne関係を仮定すると、PKおよびプロパティの名前で以下のようにカウント方法を追加することができますIDと学生)

long countByStudentId(long id); 
1

N対多関係の場合、size()関数をユーザーのコースに使用できます。

public class UserIdCountCourses { 
    private Long userId; 
    private Integer countCourses; 

    public UserIdCountCourses(Long userId, Integer countCources) { 
     this.userId = userId; 
     this.countCourses = countCources; 
    } 

    public Long getUserId() { 
     return userId; 
    } 

    public Integer getCountCourses() { 
     return countCourses; 
    } 
} 

@Query("select new package.....UserIdCountCourses(u.id , size(u.cources)) 
              from User u group by u.id") 
List<UserIdCountCourses> findUserIdAndCountEnrolledCourses(); 

また、ネイティブクエリを使用して必要なものだけを選択することもできます。ネイティブクエリの結果は、オブジェクトの配列ですが、(実体にSqlResultSetMapping、またはXML設定ファイルに追加します)のような名前付きネイティブクエリの@SqlResultSetMapping適用することができます:あなたはこのようなあなたのStudentRepositoryで以下のようにメソッドを追加することができます

@SqlResultSetMapping(
    name="UserIdCountCoursesMapping", 
    classes={ 
     @ConstructorResult(
      targetClass=UserIdCountCourses.class, 
      columns={ 
       @ColumnResult(name="user_id"), 
       @ColumnResult(name="count_courses") 
      } 
     ) 
    } 
) 
--just query example 
@NamedNativeQuery(name="getUserIdCountCourses", query="SELECT user_id,count (1) FROM user LEFT JOIN cources cu ON user_id=cu.user_id",resultSetMapping="UserIdCountCoursesMapping")