Wie verwende ich Array -Funktionen in JPA -Abfrage ohne native Abfrage?
Posted: 25 Feb 2025, 10:36
Ich möchte die Funktion array_overlaps () in einer JPA -Abfrage verwenden, ohne explizit auf eine native Abfrage zurückzugreifen.
) behebt das Problem nicht. Darüber hinaus ist in meinem Testszenario immer der Eingangswert vorhanden, sodass das Fehlen der Nullprüfung auch nicht die Ursache ist. oder behandeln () , fand aber nicht den Weg, es richtig zu machen. Zum Beispiel Cast (: SelectedIDs AS Collection ) gibt Kompilierungsfehler an. Aber es führt auch zu Kompilierungsfehlern: < /p>
Wie kann ich eine Sammlung als Array -Parameter in JPA korrekt übergeben, damit Array_Overlaps () ohne Verwendung einer nativen Abfrage funktioniert? Gibt es eine alternative Möglichkeit, Arrays in JPA darzustellen, die das Problem der Bytea -Konvertierung vermeiden?
Code: Select all
@Query(value = """
SELECT view FROM FilterView view
WHERE (:selectedIds IS NULL
OR array_overlaps(view.ids, (:selectedIds)) IS true)
""")
List findAllByFilter(Collection selectedIds);
< /code>
Definition der Entität ansehen: < /p>
@Getter
@Setter
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "filter_view")
public class FilterView {
@JdbcTypeCode(Types.ARRAY)
@Column(name = "ids")
private Collection ids;
// other fields
}
< /code>
SQL-Datei anzeigen: < /p>
DROP VIEW IF EXISTS filter_view;
CREATE VIEW filter_view AS
SELECT
ARRAY_AGG(DISTINCT p.id) AS ids,
-- other columns
FROM my_entity p
LEFT JOIN ...
GROUP BY ...
< /code>
In dieser Konfiguration begegne ich den folgenden Laufzeitfehler: < /p>
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint[] && bytea
< /code>
Der Fehler legt nahe, dass der Parameter aus SelectedIDs als Bytea behandelt wird, obwohl er in der Methodensignatur als Sammlung definiert ist, was ich nicht vollständig verstehe, warum. Dies führt zu einem Typ -Missverhältnis.:selectedIds IS NULL OR
Code: Select all
Caused by: org.hibernate.query.sqm.produce.function.FunctionArgumentException:
Parameter 1 of function 'array_overlaps()' requires an array type
java.util.Collection, but argument is of type 'java.lang.Object'