2017-07-20 153 views
1

我有用户包含课程集和U需要得到一个学生注册的课程数。我不希望ti加载学生,因为这会加载整个学生图形对象与其他类似的地址等等。有没有一种方法使用弹簧数据jpa来得到计数。查询弹簧数据jpa计数

+0

您的课程是否也是一个实体?他们之间的关系ManytoMany或ManytoOne?发布实体代码以获得准确答案。 – Ranjeet

回答

1

您可以添加一个方法,如下面的StudentRepository (假设你的实体学生PK的ID和设置属性名作为课程)

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

另外,您也可以按照以下在CourseRepository添加计数方法(假设以学生,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名为本地查询等(添加SqlResultSetMapping成实体,或在XML配置文件):

@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")