如何使用Hibernate(5.4)标准通过组查询连接两个表? 这是我的项目实体:Project.java 所需DTO:ProjectWithSumOfTaskDto.java 数据库中的表结构:
任务: 身份证件 标题 描述 项目编号 项目: 身份证件 名称 描述 主要问题是: 我现在需要的是通过project_id列连接projects表和tasks表分组。并获取列表作为输出 我已经用HQL完成了,现在我必须学习如何在hibernate标准中完成它 我使用的是hibernate 5.4最新版本如何使用Hibernate(5.4)标准通过组查询连接两个表? 这是我的项目实体:Project.java 所需DTO:ProjectWithSumOfTaskDto.java 数据库中的表结构:,java,jpa,join,group-by,hibernate-criteria,Java,Jpa,Join,Group By,Hibernate Criteria,任务: 身份证件 标题 描述 项目编号 项目: 身份证件 名称 描述 主要问题是: 我现在需要的是通过project_id列连接projects表和tasks表分组。并获取列表作为输出 我已经用HQL完成了,现在我必须学习如何在hibernate标准中完成它 我使用的是hibernate 5.4最新版本 感谢您的阅读和对开源社区的热爱我没有使用您的数据,因为我使用的是您的基类,我也没有运行它, 解决办法是: Criteria cr = session.createCriteria(Project
感谢您的阅读和对开源社区的热爱我没有使用您的数据,因为我使用的是您的基类,我也没有运行它, 解决办法是:
Criteria cr = session.createCriteria(Project.class, "p");
cr.createAlias("p.tasks", "t", Criteria.INNER_JOIN);
cr.add(Restrictions.eq("p.id",id);
return cr.list();
我希望这会有所帮助在花了无数个小时之后,我得到了以下解决方案: 步骤: 将任务表设为根目录。 使用“多重选择”并选择task.project\u id、project.name以及分组依据后的任务行数。 最后返回了我想要的DTO列表,如下所示: 总之,代码如下所示:
public List<ProjectWithSumOfTaskDto> projectsWithTaskCount() {
return criteriaBuilderContext((session, builder) -> {
CriteriaQuery<ProjectWithSumOfTaskDto> criteria = builder.createQuery(
ProjectWithSumOfTaskDto.class
);
Root<Task> task = criteria.from(Task.class);
Join<Task, Project> projectJoin = task.join(Task_.project, JoinType.LEFT);
criteria.groupBy(task.get(Task_.project));
criteria.multiselect(
projectJoin.get(Project_.ID).alias("projectId"),
projectJoin.get(Project_.NAME).alias("name"),
builder.count(task).alias("totalTasks")
);
return session.createQuery(criteria).getResultList();
});
}
我会给它一个痛苦的人,我看了你的答案,但这不是我需要的。谢谢
public class ProjectWithSumOfTaskDto {
private int projectId;
private String name;
private long totalTasks;
public ProjectWithSumOfTaskDto(int id, String name, long totalTasks) {
this.projectId = id;
this.name = name;
this.totalTasks = totalTasks;
}
// getter setter here
}
Criteria cr = session.createCriteria(Project.class, "p");
cr.createAlias("p.tasks", "t", Criteria.INNER_JOIN);
cr.add(Restrictions.eq("p.id",id);
return cr.list();
Root<Task> task = criteria.from(Task.class);
Join<Task, Project> projectJoin = task.join(Task_.project, JoinType.LEFT);
criteria.groupBy(task.get(Task_.project));
criteria.multiselect(projectJoin.get(Project_.ID).alias("projectId"),
projectJoin.get(Project_.NAME).alias("name"),
builder.count(task).alias("totalTasks"));
return session.createQuery(criteria).getResultList();
public List<ProjectWithSumOfTaskDto> projectsWithTaskCount() {
return criteriaBuilderContext((session, builder) -> {
CriteriaQuery<ProjectWithSumOfTaskDto> criteria = builder.createQuery(
ProjectWithSumOfTaskDto.class
);
Root<Task> task = criteria.from(Task.class);
Join<Task, Project> projectJoin = task.join(Task_.project, JoinType.LEFT);
criteria.groupBy(task.get(Task_.project));
criteria.multiselect(
projectJoin.get(Project_.ID).alias("projectId"),
projectJoin.get(Project_.NAME).alias("name"),
builder.count(task).alias("totalTasks")
);
return session.createQuery(criteria).getResultList();
});
}