Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Hibernate(5.4)标准通过组查询连接两个表? 这是我的项目实体:Project.java 所需DTO:ProjectWithSumOfTaskDto.java 数据库中的表结构:_Java_Jpa_Join_Group By_Hibernate Criteria - Fatal编程技术网

如何使用Hibernate(5.4)标准通过组查询连接两个表? 这是我的项目实体:Project.java 所需DTO:ProjectWithSumOfTaskDto.java 数据库中的表结构:

如何使用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

任务:

身份证件 标题 描述 项目编号 项目:

身份证件 名称 描述 主要问题是: 我现在需要的是通过project_id列连接projects表和tasks表分组。并获取列表作为输出

我已经用HQL完成了,现在我必须学习如何在hibernate标准中完成它

我使用的是hibernate 5.4最新版本


感谢您的阅读和对开源社区的热爱

我没有使用您的数据,因为我使用的是您的基类,我也没有运行它, 解决办法是:

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();
    });
}