相关疑难解决方法(0)

在JPA Criteria API中使用子查询中的ORDER BY有哪些替代方法?

考虑以下两个表:

  1. Project ( id, project_name)
  2. Status ( id, id_project, status_name)

其中Status包含a所有的状态Project.

假设我们要查询最新状态名为"new"的所有项目.我想出的Sql查询是:

SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id IN (
    SELECT TOP 1 sq.id from status sq
    WHERE q.id_project = sq.id_project 
    ORDER BY sq.id DESC )
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Criteria API复制上述查询,我​​注意到类CriteriaQuery有方法,orderBy但类Subquery没有.

我到目前为止提出的标准查询是:

CriteriaQuery<Project> q = criteriaBuilder.createQuery(Project.class);
Root<Status> qFrom       = q.from(Status.class);
Subquery<Integer> sq     = q.subquery(Integer.class);
Root<Status> sqFrom      = sq.from(Status.class);

sq.select(sqFrom.get(Status_.id))
  .where(criteriaBuilder.equal(sqFrom.get(Status_.project), qFrom.get(Status_.project))
Run Code Online (Sandbox Code Playgroud)

我被困在这里,因为Subquery sq没有任何方法可以对结果进行排序并只返回最新结果.

排序子查询以便在上述场景中获得所需结果的替代方法是什么?

java sql-server hibernate jpa criteria

7
推荐指数
1
解决办法
3002
查看次数

子查询的jpql顺序产生意外的AST节点异常

我将一个工作(postgre)sql查询翻译成jpql,但是hibernate抛出一个

org.hibernate.hql.ast.QuerySyntaxException:意外的AST节点异常

这些是我的核心模型类:

@Entity
public class Piece {
    @Id
    @GeneratedValue
    public Long id;

    @ManyToOne
    public AUser user;
    public long index;
...
}

@Entity
public class Vote {
    @Id
    @GeneratedValue
    public Long id;

    @ManyToOne
    public AUser receiver;
...
}

@Entity
public class AUser {
    @Id
    @GeneratedValue
    public Long id;

    @OneToMany(mappedBy="receiver", cascade=CascadeType.ALL)
    public List<Vote> receivedVotes;
...
}
Run Code Online (Sandbox Code Playgroud)

这是我的jpql查询:

String query = "select p from Piece p order by (select count(v.receiver) from Vote v where v.receiver.id=p.user.id) desc, p.index";
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释异常,它为什么会发生以及如何更改查询以避免它.谢谢!

hibernate jpql playframework

3
推荐指数
1
解决办法
5727
查看次数

标签 统计

hibernate ×2

criteria ×1

java ×1

jpa ×1

jpql ×1

playframework ×1

sql-server ×1