Hallo,
Ich habe Probleme herauszufinden, wie 'GROUP_CONCAT' in QueryDSL verwendet wird.
final QDataSourceSmallEliminate eliminate = QDataSourceSmallEliminate.dataSourceSmallEliminate;
final QLattitudeVisitor lattitude = LattitudeVisitorServiceImpl.$;
// Expressions.stringOperation(SQLOps.GROUP_CONCAT, lattitude.tagName)
return QuerydslUtils.newQuery(entityManager).select(Projections.constructor(EliminateLattitude.class,
eliminate.id,
JPAExpressions.selectDistinct( SQLExpressions.groupConcat(lattitude.tagName)).from(lattitude).where(lattitude.urlCrc.eq(eliminate.urlCrc))))
.from(eliminate)
.fetch();
Ausnahme:
org.springframework.dao.InvalidDataAccessApiUsageException: No pattern found for GROUP_CONCAT; nested exception is java.lang.IllegalArgumentException: No pattern found for GROUP_CONCAT
...
Caused by: java.lang.IllegalArgumentException: No pattern found for GROUP_CONCAT
at com.querydsl.core.support.SerializerBase.visitOperation(SerializerBase.java:280)
at com.querydsl.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:437)
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:231)
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:31)
at com.querydsl.core.types.OperationImpl.accept(OperationImpl.java:83)
at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92)
at com.querydsl.jpa.JPQLSerializer.serialize(JPQLSerializer.java:203)
at com.querydsl.jpa.JPQLSerializer.visit(JPQLSerializer.java:358)
at com.querydsl.jpa.JPQLSerializer.visit(JPQLSerializer.java:39)
at com.querydsl.core.types.SubQueryExpressionImpl.accept(SubQueryExpressionImpl.java:57)
at com.querydsl.core.support.FetchableSubQueryBase.accept(FetchableSubQueryBase.java:150)
at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92)
at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:119)
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:225)
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:31)
at com.querydsl.core.types.ConstructorExpression.accept(ConstructorExpression.java:112)
at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92)
at com.querydsl.jpa.JPQLSerializer.serialize(JPQLSerializer.java:203)
at com.querydsl.jpa.JPAQueryBase.serialize(JPAQueryBase.java:60)
at com.querydsl.jpa.JPAQueryBase.serialize(JPAQueryBase.java:50)
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:98)
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:94)
at com.querydsl.jpa.impl.AbstractJPAQuery.fetch(AbstractJPAQuery.java:201)
at com.moraydata.general.secondary.repository.impl.DataSourceSmallEliminateRepositoryImpl.findObject(DataSourceSmallEliminateRepositoryImpl.java:98)
at com.moraydata.general.secondary.repository.impl.DataSourceSmallEliminateRepositoryImpl$$FastClassBySpringCGLIB$$b42d875d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
QueryDSL 4.2.1 & JDK1.8 & Spring Boot2.0 & MySQL 5.7.
Ich habe das neueste Referenzdokument gelesen und kann die Antwort immer noch nicht finden. Was muss ich also tun, damit es funktioniert?
Bitte helfen Sie.
Danke im Voraus.
@ Shredder121
Sie können JPAExpressions und SQLExpressions nicht immer mischen.
Sie können JPAExpressions und SQLExpressions nicht immer mischen.
Ja, Kumpel, du hast recht. Ich habe keine Ahnung, wie ich das beheben kann. Probieren Sie einfach etwas Nützliches aus.
Wie kann ich damit umgehen, wenn ich bei Verwendung von JPAExpressions GROUP_CONCAT benötige?
@beamofsoul
Wenn Sie Spring Boot Data JPA und querydsl-jpa
, können Sie diese Schritte ausführen
// org.hibernate.dialect.MySQL5Dialect
public class CustomMysqlDialect extends MySQL5Dialect {
public CustomMysqlDialect() {
super();
// register custom/inner function here
this.registerFunction("group_concat", new SQLFunctionTemplate(StandardBasicTypes.STRING, "group_concat(?1)"));
}
}
<strong i="15">@Configuration</strong>
public class JpaConfiguration {
<strong i="16">@Bean</strong>
public JpaVendorAdapter jpaVendorAdapter() {
AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(true);
adapter.setDatabase(Database.MYSQL);
// package to CustomMysqlDialect
adapter.setDatabasePlatform("com.xxx.xxx.config.CustomMysqlDialect");
adapter.setGenerateDdl(false);
return adapter;
}
}
// before do this , autowird JPAQueryFactory at first
QReportDoctorTag qReportDoctorTag = QReportDoctorTag.reportDoctorTag;
SimpleTemplate<String> simpleTemplate = Expressions.simpleTemplate(String.class, "group_concat({0})", qReportDoctorTag.tag);
JPAQuery<Tuple> tupleJPAQuery = queryFactory.select(qReportDoctorTag.reportId, simpleTemplate)
.from(qReportDoctorTag)
.groupBy(qReportDoctorTag.reportId);
List<Tuple> fetch = tupleJPAQuery.fetch();
Verwenden Sie für SQL SQLExpressions.groupConcat
. Für JPA wird dies nicht unterstützt, da GROUP_CONCAT
keine für JPQL definierte Funktion ist. Keiner der ORM-Anbieter liefert es standardmäßig aus, obwohl die Funktion in einigen Fällen manuell registriert werden kann (siehe Beispiel im obigen Kommentar).
Duplikat von # 2020.
@ giraffe-tree Hallo, ich möchte "GROUP_CONCAT ({0} ORDER BY {1})" verwenden. Wie registriere ich die Funktion? Bitte.
In JPA wird dies nicht unterstützt. Sie müssen Ihren ORM-Anbieter bitten, ihn zuerst zu implementieren (z. B. Ruhezustand).
Sie können die Erweiterung blaze-persistence-querydsl
, um die Lücke zu schließen: https://persistence.blazebit.com/documentation/1.5/core/manual/en_US/index.html#querydsl -integration
Welches hat die folgenden Methoden:
JPQLNextExpressions.groupConcat(Expression<?> expression, String separator, OrderSpecifier<?>... orderSpecifiers)
JPQLNextExpressions.groupConcat(Expression<?> expression, Expression<String> separator, OrderSpecifier<?>... orderSpecifiers)
JPQLNextExpressions.groupConcat(boolean distinct, Expression<?> expression, String separator, OrderSpecifier<?>... orderSpecifiers)
JPQLNextExpressions.groupConcat(boolean distinct, Expression<?> expression, Expression<String> separator, OrderSpecifier<?>... orderSpecifiers)
Hilfreichster Kommentar
@beamofsoul
Wenn Sie Spring Boot Data JPA und
querydsl-jpa
, können Sie diese Schritte ausführen