2016-04-07 11 views
8

Ich verwende Hibernate und Postgres und einen character(1)[] Spaltentyp definiert.Wie Sie Kriterien mit Array-Feld im Ruhezustand machen

Also ich weiß nicht, wie man diese criteria machen, um einen Wert im Array zu finden.

Wie diese Abfrage

SELECT * FROM cpfbloqueado WHERE bloqueados @> ARRAY['V']::character[] 
+0

haben Sie überprüfen: http://StackOverflow.com/Questions/22649964/How-to-save-or-retrieve-an-array-column-using-hibernate –

+0

Wenn Sie die letzte Antwort suchen, ist es meins. – user3503888

+0

Können Sie den Quellcode platzieren, den Sie ausprobiert haben? – SubbaReddy

Antwort

2

So haben Sie Array einzelner Zeichen ... Das Problem ist, dass in PG, die nicht fester Länge ist. Ich hatte dieses Problem, aber vor etwa 10 Jahren. Zu dieser Zeit hatte ich diese Spalte als String gemappt, und auf diese Weise konnte ich interne Daten verarbeiten - einfach per Komma schneiden und tun, was benötigt wird. Wenn Sie so hassen, wie ich ... Suchen Sie nach Spalten mit text[] Typ - das ist häufiger, so ist es ziemlich einfach, etwas herauszufinden. Betrachten Sie bitte dieses Beispielprojekt: https://github.com/phstudy/jpa-array-converter-sample

4

Ich bin nicht vertraut mit Postgres und seine Art, aber Sie können Ihre eigene Art mit custom basic type mapping definieren. Das könnte die Abfrage vereinfachen.

Es gibt viele Threads hier auf SO in Bezug auf Postres Array-Typen und Hibernate, zum Beispiel this one. Ein weiteres Array-Mapping-Beispiel, das nützlich sein könnte is here. Zuletzt, here is an example der Verwendung von Kriterien mit Benutzertyp.

Codebeispiel könnte

List result = session.createCriteria(Cpfbloqueado.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("characterColumn.attribute"), PostgresCharArrayType.class) 
    ) 
    .setResultTransformer(Transformer.aliasToBean(Cpfbloqueado.class)) 
    .add(...) // add where restrictions here 
    .list() 

auch sein, wenn es nicht wichtig für die Umsetzung ist, Sie maximale Länge in dem Entity-Modell definieren, Ihr Feldes mit @Column(length = 1) Anmerkungen versehen.

Oder wenn Sie ein Array von Zeichen mit der Länge von 1 speichern müssen, ist es möglich, eine collection type zu verwenden.


Ich hoffe, ich habe den Punkt richtig, aber es wäre nett, wenn die Problemdomäne besser beschrieben wäre.

+0

Wie ich im Thema sagte, möchte ich einen Wert im Array finden, als IN-Klausel, vorstellen, wenn ich ein Array '{ 'A', 'B', 'C'} 'und möchten wissen, ob es möglich ist, diese Spalte nach' B 'zu suchen. –

+1

@DiegoMacario: Ja, es ist möglich entweder ElementCollection zu verwenden und das Array-Feld im Hibernate zu definieren Entitätsmodell (und frage es wie http://stackoverflow.com/questions/14090364/hql-how-to-query-elementcollection-of-string ab) oder definiere dein eigenes Array usertype (etwas wie http://stackoverflow.com/ Fragen/21940642/Hibernate-Postgres-Array-Typ). –

Verwandte Themen