Ich verwende Blaze Persistence, um die Abfrage zusammenzustellen.
Eine der Optionen, die der Builder unterstützen muss, besteht darin, zu prüfen, ob ein Listenattribut einen bestimmten Wert enthält.
Im Pseudocode würde dies also Entity.Attribute.contains(passedValue) bedeuten.
Womit ich zu kämpfen habe Jetzt geht es darum, diese Abfrage zum Laufen zu bringen.
Ich habe eine Ansicht erstellt, die das folgende Feld enthält:
Code: Select all
@Type(ListArrayType.class)
@Column(name = "co_creators", columnDefinition = "UUID[]")
private List coCreators;
Code: Select all
COALESCE(
(SELECT ARRAY_AGG(cc.cocreatorid)
FROM cocreator cc
WHERE cc.elementid = c.id
AND cc.elementtype = 'COURSE'),
'{}'
) AS co_creators
1. where(value).in(fieldName)
Code: Select all
restrictionBuilder = criteria.where(queryParams.getValue().toString());
restrictionBuilder.in(queryParams.getFieldName());
Code: Select all
com.blazebit.persistence.parser.expression.SyntaxErrorException: Could not parse expression '7035bf82-a831-4a78-8615-6cc0e0c1ca26', line 1:4 mismatched input 'bf82' expecting {, '+', '-', '*', '/', '%', '||'}
Code: Select all
restrictionBuilder = criteria.where(":value");
restrictionBuilder.in(queryParams.getFieldName());
criteria.setParameter("value", queryParams.getValue().toString());
Code: Select all
SELECT selectedObject FROM CourseView selectedObject WHERE :value IN (:param_0) ORDER BY selectedObject.uuid DESC
Code: Select all
{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
3. Verwenden Sie FUNCTION
Ich habe es auch versucht
Code: Select all
restrictionBuilder = criteria.where("FUNCTION('any', :value, coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
4. Benutze FUNCTION ohne param
Dann habe ich dasselbe ohne setParameter versucht, etwa:
Code: Select all
restrictionBuilder =
criteria.where("FUNCTION('any', " + queryParams.getValue().toString() + ", coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
5. Escape-Wert
Escape-Wert auch wie
Code: Select all
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
enden
Code: Select all
ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
Ich habe dann Folgendes versucht:
Code: Select all
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
restrictionBuilder.eq(true);
Code: Select all
Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type boolean: "7035bf82-a831-4a78-8615-6cc0e0c1ca26"
Position: 562
Gibt es eine Möglichkeit, dies mit Blaze Persistence so zum Laufen zu bringen, wie ich es brauche?Ich denke, eine Option wäre die Verwendung einer nativen Abfrage, es muss jedoch möglich sein, nur eine native Abfrage für diese Bedingung zu verwenden, sie aber mit anderen (nicht nativen) Bedingungen zu kombinieren.
Allerdings weiß ich auch nicht, wie ich benutzerdefinierte Abfragen/Bedingungen einbinden soll in Blaze Persistence.