繁体   English   中英

JPA Criteria按最新子属性查询顺序

[英]JPA CriteriaQuery Order By Latest Child Property

我有2个实体:Project和ProjectStatus。

项目实体:

@Entity
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @OneToMany(mappedBy = "project")
    private List<ProjectStatus> projectStatusses;
}

项目状态实体:

@Entity
public class ProjectStatus {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @ManyToOne
    private Project project;

    @Enumerated(EnumType.STRING)
    private ProjectStatusType statusType;
}

我想按CriteriaQuery.orderBy的最新状态类型对项目进行排序。

我想出了以下几点:

CriteriaQuery<Project> criteriaQuery = criteriaBuilder.createQuery(Project.class);
Root<Project> root = criteriaQuery.from(Project.class);
Join<Project, ProjectStatus> join = root.join("projectStatusses", JoinType.LEFT);
criteriaQuery.orderBy(criteriaBuilder.asc(join.get("statusType")));

我希望上述查询仅考虑最新的项目状态,但是我不知道该怎么做。 我该如何实现?

更新:实现此目的的sql是:

SELECT proj.*, stat.statustype 
FROM project proj
LEFT JOIN projectStatus stat ON proj.id = stat.project_id
WHERE stat.id = (SELECT MAX(id) FROM projectstatus WHERE project_id = proj.id)
ORDER BY stat.statustype

我不喜欢回答自己的问题,但找到了解决方案。 希望它将对其他人有所帮助。

我的错是在criteriaQuery.orderBy方法中寻找解决方案。 criteriaQuery.where方法中添加子查询可以解决问题。

解:

    CriteriaQuery<Project> criteriaQuery = criteriaBuilder.createQuery(Project.class);
    Root<Project> root = criteriaQuery.from(Project.class);
    Join<Project, ProjectStatus> join = root.join("projectStatusses", JoinType.LEFT);

    //Create a subquery to get latest ProjectStatus for project
    Subquery sq = criteriaBuilder.createQuery().subquery(Long.class);
    Root<T> from = sq.from(Project.class);
    Path<ProjectStatus> path = root.join("projectStatusses");
    //Get latest status
    sq.select(criteriaBuilder.max(path.<Long>get("id")));
    //For each project
    sq.where(criteriaBuilder.equal(from.<Long>get("id"), root.<Long>get("id")));
    Predicate latestStatusCondition = criteriaBuilder.and(criteriaBuilder.equal(join.get("id"), sq));

    criteriaQuery.orderBy(criteriaBuilder.asc(join.get("statusType")));
    criteriaQuery.where(latestStatusCondition);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM