Die Liste der Blaze-Persistenzprüfungen enthält einen EintragJava

Java-Forum
Guest
 Die Liste der Blaze-Persistenzprüfungen enthält einen Eintrag

Post by Guest »

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post