2011-12-14 12 views
20

Esiste un operatore di concatenazione JPA per concatenazione di stringhe?Operatore JPA concat

So che esiste una funzione JPA CONCAT, tuttavia è brutta da utilizzare per concatenare più stringhe.

CONCAT(CONCAT(CONCAT(cola,colb),colc),cold) 

fornitori come Oracle offerta || qualche altro come Microsoft offerta +. Esiste un operatore di APP di concatenazione standard in modo che avrei potuto creare una query come

cola || colb || colc || cold 

ho provato + usando OpenJPA con SQL Server, tuttavia sembra essere JPQL valido. Non sono riuscito a trovare nulla riguardo a un operatore del genere in un oracle reference.

risposta

33

La funzione CONCAT stato esteso in JPA 2.0 per consentire il passaggio più di 2 parametri, dalla sezione 4.6.17.2.1 (funzioni stringa) della specifica:

CONCAT(string_primary, string_primary {, string_primary}*) 

In JPA 1 questo era limitato a esattamente due parametri.

+0

Hmm. Strano. http://download.oracle.com/otn-pub/jcp/persistence-2.0-fr-eval-oth-JSpec/persistence-2_0-final-spec.pdf elenca questa funzione come l'hai descritta. Openjpa 2.1.1 dovrebbe essere JPA 2.0. –

+1

OpenJpa 2 dovrebbe supportare questa sintassi, puoi pubblicare la query esatta e l'eccezione che stai ricevendo? –

7

È possibile utilizzare la funzione JPA Concat per più stringhe.

Ad esempio:

CONCAT(cola, colb, colc, cold) 
+1

Controllato che. Ottengo un'eccezione con openjpa. Il riferimento che ho collegato (http://docs.oracle.com/cd/E16764_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_string_fun) mostra solo due argomenti. –

6

È possibile anche utilizzare || come operatore di concatenazione, vedere on the documentation

HQL definisce un operatore di concatenazione oltre a sostenere la funzione concatenazione (CONCAT). Questo non è definito da JPQL, quindi le applicazioni portatili dovrebbero evitarne l'uso. L'operatore di concatenazione viene prelevato dall'operatore di concatenazione SQL - ||.

Esempio 11.19. funzionamento concatenazione esempio

select 'Mr. ' || c.name.first || ' ' || c.name.last 
from Customer c 
where c.gender = Gender.MALE