Ich versuche derzeit, einen generischen Abfrage-Builder zu implementieren, der in verschiedenen Entitäten wiederverwendet werden kann.
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;
der wie folgt erstellt wird:
Code: Select all
COALESCE(
(SELECT ARRAY_AGG(cc.cocreatorid)
FROM cocreator cc
WHERE cc.elementid = c.id
AND cc.elementtype = 'COURSE'),
'{}'
) AS co_creators
Ich versuche dann, die Abfrage auf folgende Weise zusammenzustellen, aber nichts funktioniert wie erwartet:
1. where(value).in(fieldName)
Code: Select all
restrictionBuilder = criteria.where(queryParams.getValue().toString());
restrictionBuilder.in(queryParams.getFieldName());
Dies führt zu
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 {, '+', '-', '*', '/', '%', '||'}
2. Wert als Parameter festlegen
Code: Select all
restrictionBuilder = criteria.where(":value");
restrictionBuilder.in(queryParams.getFieldName());
criteria.setParameter("value", queryParams.getValue().toString());
Dadurch wird eine Abfrage wie folgt erstellt:
Code: Select all
SELECT selectedObject FROM CourseView selectedObject WHERE :value IN (:param_0) ORDER BY selectedObject.uuid DESC
Dies scheint jedoch korrekt zu sein, wenn ich eine Entität mit dem Feld „coCreators“ habe wie:
Code: Select all
{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
Und übergeben Sie „7035bf82-a831-4a78-8615-6cc0e0c1ca26“ als meinen Wert. Es wird eine leere Liste zurückgegeben, aber ich erwarte, dass der obige Eintrag gefunden wird.
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());
dies führt jedoch zu Resolved [java.lang.IllegalArgumentException: Parameter name „value“ does not exist]
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());
Was mit derselben SyntaxErrorException endetwie meine erste Option
5. Escape-Wert
Escape-Wert auch wie
Code: Select all
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
hilft nicht. Dies wird mit
enden
Code: Select all
ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
6. Escape-Wert mit eq(true)
Ich habe dann Folgendes versucht:
Code: Select all
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
restrictionBuilder.eq(true);
wie jeder sollte einen booleschen Wert zurückgeben, aber auch dies löst das Problem nicht, da es zu Folgendem führt:
Code: Select all
Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type boolean: "7035bf82-a831-4a78-8615-6cc0e0c1ca26"
Position: 562
Ich bin hier völlig verloren und würde mich wirklich über Hilfe freuen.
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.
Ich versuche derzeit, einen generischen Abfrage-Builder zu implementieren, der in verschiedenen Entitäten wiederverwendet werden kann.
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]@Type(ListArrayType.class)
@Column(name = "co_creators", columnDefinition = "UUID[]")
private List coCreators;
[/code]
der wie folgt erstellt wird:
[code]COALESCE(
(SELECT ARRAY_AGG(cc.cocreatorid)
FROM cocreator cc
WHERE cc.elementid = c.id
AND cc.elementtype = 'COURSE'),
'{}'
) AS co_creators
[/code]
Ich versuche dann, die Abfrage auf folgende Weise zusammenzustellen, aber nichts funktioniert wie erwartet:
[b]1. where(value).in(fieldName)[/b]
[code]restrictionBuilder = criteria.where(queryParams.getValue().toString());
restrictionBuilder.in(queryParams.getFieldName());
[/code]
Dies führt zu
[code]com.blazebit.persistence.parser.expression.SyntaxErrorException: Could not parse expression '7035bf82-a831-4a78-8615-6cc0e0c1ca26', line 1:4 mismatched input 'bf82' expecting {, '+', '-', '*', '/', '%', '||'}
[/code]
[b]2. Wert als Parameter festlegen[/b]
[code]restrictionBuilder = criteria.where(":value");
restrictionBuilder.in(queryParams.getFieldName());
criteria.setParameter("value", queryParams.getValue().toString());
[/code]
Dadurch wird eine Abfrage wie folgt erstellt:
[code]SELECT selectedObject FROM CourseView selectedObject WHERE :value IN (:param_0) ORDER BY selectedObject.uuid DESC
[/code]
Dies scheint jedoch korrekt zu sein, wenn ich eine Entität mit dem Feld „coCreators“ habe wie:
[code]{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
[/code]
Und übergeben Sie „7035bf82-a831-4a78-8615-6cc0e0c1ca26“ als meinen Wert. Es wird eine leere Liste zurückgegeben, aber ich erwarte, dass der obige Eintrag gefunden wird.
[b]3. Verwenden Sie FUNCTION[/b]
Ich habe es auch versucht
[code]restrictionBuilder = criteria.where("FUNCTION('any', :value, coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
[/code]
dies führt jedoch zu Resolved [java.lang.IllegalArgumentException: Parameter name „value“ does not exist]
[b] 4. Benutze FUNCTION ohne param[/b]
Dann habe ich dasselbe ohne setParameter versucht, etwa:
[code]restrictionBuilder =
criteria.where("FUNCTION('any', " + queryParams.getValue().toString() + ", coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
[/code]
Was mit derselben SyntaxErrorException endetwie meine erste Option
[b]5. Escape-Wert[/b]
Escape-Wert auch wie
[code]restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
[/code]
hilft nicht. Dies wird mit
enden[code]ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
[/code]
[b]6. Escape-Wert mit eq(true)[/b]
Ich habe dann Folgendes versucht:
[code]restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
restrictionBuilder.eq(true);
[/code]
wie jeder sollte einen booleschen Wert zurückgeben, aber auch dies löst das Problem nicht, da es zu Folgendem führt:
[code]Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type boolean: "7035bf82-a831-4a78-8615-6cc0e0c1ca26"
Position: 562
[/code]
Ich bin hier völlig verloren und würde mich wirklich über Hilfe freuen.
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.