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”
参考资料:非常感谢,我会试试这些:)非常感谢,我会试试这些:)