Java 如何将Listag与querydsl一起使用?

Java 如何将Listag与querydsl一起使用?,java,oracle,spring-boot,jpa,querydsl,Java,Oracle,Spring Boot,Jpa,Querydsl,我有一个如下所示的查询 SELECT . . LISTAGG(DISTINCT CC.POPULATION, ', ') WITHIN GROUP (ORDER BY CC.POPULATION ASC), . . FROM COUNTRY C JOIN CITY CC ON C.ID = CC.COUNTRY_ID --WHERE GROUP BY C.ID; 我应该使用querydsl实现自定义筛选和排序操作,但我遇到了“没有为LISTAGG找到

我有一个如下所示的查询

SELECT 
   .
   .
   LISTAGG(DISTINCT CC.POPULATION, ', ') WITHIN GROUP (ORDER BY CC.POPULATION ASC),
   .
   .
FROM COUNTRY C
     JOIN CITY CC ON C.ID = CC.COUNTRY_ID
--WHERE 
GROUP BY C.ID;
我应该使用querydsl实现自定义筛选和排序操作,但我遇到了“没有为LISTAGG找到模式”错误


窗口函数不包括在JPQL规范中,因此在任何JPA实现中都不可用。您可以自己使用注册这些函数

但是,在此之后,这些函数仍然无法在QueryDSL中访问。您正在从这里的
SQLExpressions
获取窗口表达式。这些方法存在于
SQLExpressions
中有一个原因:它们只适用于
querydsl sql
,而不适用于
querydsl jpa
(同样,因为jpa本身不支持窗口函数)。因此,在注册自定义函数后,您仍然需要扩展
JPQLTemplates
以包含自定义窗口函数的模板

你会这样做:

public class MyTemplates extends JPQLTemplates {

    public MyTemplates() {
        add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
    }

}
public class SqlFunctionsMetadataBuilderContributor
    implements MetadataBuilderContributor {
     
 @Override
 public void contribute(MetadataBuilder metadataBuilder) {
    metadataBuilder.applySqlFunction(
        "group_concat",
        new StandardSQLFunction(
            "group_concat",
            StandardBasicTypes.STRING
        )
    );
 }
}
然后按如下方式使用:

newJPAQUERY(entityManager,new MyTemplates())。从(实体)中。选择(rowNumber())

或者,您也可以研究这个扩展,它对JPQL的窗口函数(和许多其他特性)具有现成的支持。例如:

QCat=QCat.cat;
BlazeJPAQuery查询=新建BlazeJPAQuery(entityManager,criteriaBuilderFactory)。来自(cat)
.select(cat.name,JPQLNextExpressions.rowNumber(),JPQLNextExpressions.lastValue(cat.name).over().partitionBy(cat.id));
List fetch=query.fetch();

窗口函数不包含在JPQL规范中,因此在任何JPA实现中都不可用。您可以自己使用注册这些函数

但是,在此之后,这些函数仍然无法在QueryDSL中访问。您正在从这里的
SQLExpressions
获取窗口表达式。这些方法存在于
SQLExpressions
中有一个原因:它们只适用于
querydsl sql
,而不适用于
querydsl jpa
(同样,因为jpa本身不支持窗口函数)。因此,在注册自定义函数后,您仍然需要扩展
JPQLTemplates
以包含自定义窗口函数的模板

你会这样做:

public class MyTemplates extends JPQLTemplates {

    public MyTemplates() {
        add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
    }

}
public class SqlFunctionsMetadataBuilderContributor
    implements MetadataBuilderContributor {
     
 @Override
 public void contribute(MetadataBuilder metadataBuilder) {
    metadataBuilder.applySqlFunction(
        "group_concat",
        new StandardSQLFunction(
            "group_concat",
            StandardBasicTypes.STRING
        )
    );
 }
}
然后按如下方式使用:

newJPAQUERY(entityManager,new MyTemplates())。从(实体)中。选择(rowNumber())

或者,您也可以研究这个扩展,它对JPQL的窗口函数(和许多其他特性)具有现成的支持。例如:

QCat=QCat.cat;
BlazeJPAQuery查询=新建BlazeJPAQuery(entityManager,criteriaBuilderFactory)。来自(cat)
.select(cat.name,JPQLNextExpressions.rowNumber(),JPQLNextExpressions.lastValue(cat.name).over().partitionBy(cat.id));
List fetch=query.fetch();

自Hibernate 5.2.18以来,即使您是通过JPA引导,也可以使用MetadataBuilderContributor实用程序自定义MetadataBuilder

MetadataBuilderContributor
接口可以如下实现:

public class MyTemplates extends JPQLTemplates {

    public MyTemplates() {
        add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
    }

}
public class SqlFunctionsMetadataBuilderContributor
    implements MetadataBuilderContributor {
     
 @Override
 public void contribute(MetadataBuilder metadataBuilder) {
    metadataBuilder.applySqlFunction(
        "group_concat",
        new StandardSQLFunction(
            "group_concat",
            StandardBasicTypes.STRING
        )
    );
 }
}
并且,我们可以通过hibernate.metadata\u builder\u contributor配置属性提供SqlFunctionsMetadataBuilderContributor:

<property>
    name="hibernate.metadata_builder_contributor"
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

name=“hibernate.metadata\u builder\u contributor”
value=“com.vladmin.book.hpjp.hibernate.query.function.sqlfunctionsmetatabuilderContributor”

参考资料:

自Hibernate 5.2.18以来,即使您是通过JPA引导,也可以使用MetadataBuilderContributor实用程序自定义MetadataBuilder

MetadataBuilderContributor
接口可以如下实现:

public class MyTemplates extends JPQLTemplates {

    public MyTemplates() {
        add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
    }

}
public class SqlFunctionsMetadataBuilderContributor
    implements MetadataBuilderContributor {
     
 @Override
 public void contribute(MetadataBuilder metadataBuilder) {
    metadataBuilder.applySqlFunction(
        "group_concat",
        new StandardSQLFunction(
            "group_concat",
            StandardBasicTypes.STRING
        )
    );
 }
}
并且,我们可以通过hibernate.metadata\u builder\u contributor配置属性提供SqlFunctionsMetadataBuilderContributor:

<property>
    name="hibernate.metadata_builder_contributor"
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

name=“hibernate.metadata\u builder\u contributor”
value=“com.vladmin.book.hpjp.hibernate.query.function.sqlfunctionsmetatabuilderContributor”

参考资料:

非常感谢,我会试试这些:)非常感谢,我会试试这些:)