spring-data-jpa 使用QueryDsl predicate 和spring jpa通过降序排序从结果集中获取第一行

6gpjuf90  于 2022-11-10  发布在  Spring
关注(0)|答案(4)|浏览(325)

我是spring JPA的新手。我有一个查询,这样我必须得到结果集,并且只取顶部的行。我不知道如何在spring JPA中完成它。而且我不想使用@Query注解来完成它,因为我被要求不要在代码中使用任何查询。这是我想要转换的查询

我的查询

SELECT id,name FROM example_table ORDER BY id DESC LIMIT 1;

我在我的 predicate 文件中尝试了如下内容:

public Predicate getLatest(){
 QExampleTable example = QExampleTable.exampleTable;
 return (Predicate) example.id.desc();     
}

这是我的jpa存储库的样子:

public ExampleTable findOne(MyPredicate.getLatest());

但这是不工作了,我知道它不会清楚。但我真的不知道如何转换上述查询。有人能帮助我解决这个问题吗

clj7thdc

clj7thdc1#

您可以只使用QueryDSL而不使用 predicate 和存储库。

List<ExampleTable> examples = new JPAQuery()
                .from(QExampleTable.exampleTable)
                .limit(1)
                .orderBy(new OrderSpecifier<>(Order.DESC, QExampleTable.exampleTable.id))
                .list(QExampleTable.exampleTable);
vom3gejh

vom3gejh2#

您可以使用偏移或限制函数。
在您的情况下.limit(1)应该足够了

yc0p9oo0

yc0p9oo03#

因为desc()返回一个必须与Query.orderBy()一起使用的OrderSpecifier,所以这是行不通的。
下面的语句可以工作,尽管它不是一个“纯” predicate :

public Predicate getLatest() {
  QExampleTable example = QExampleTable.exampleTable;
  return example.id.eq(new JPASubQuery().from(example).unique(example.id.max()));
}

恐怕一个更干净的解决方案是您提供一个CustomRepository +实现。

6g8kf2rb

6g8kf2rb4#

对于我来说,使用QueryDSL的有效选项是使用max()。

JPAExpressions.selectFrom(QExampleTable.exampleTable)
    .select(QExampleTable.exampleTable.max())

相关问题