如何计算Spring Data JPA中的相关实体?

66bbxpm5  于 2023-01-13  发布在  Spring
关注(0)|答案(2)|浏览(118)

我有包含一组课程的用户,你只需要得到一个学生注册的课程计数。我不想加载学生,因为这将加载整个学生图形对象与其他属性,如地址等。有没有一种方法使用spring数据jpa只得到计数。

qyuhtwio

qyuhtwio1#

您可以在您的StudentRepository中添加一个如下所示的方法(假设您的实体Student pk为id,并将属性名称设置为courses)

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

或者,您也可以在CourseRepository中添加如下计数方法(假设课程与学生的多对一关系,pk和属性名称为id和student)

long countByStudentId(long id);
sczxawaw

sczxawaw2#

由于您有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")

相关问题