2012-04-12 15 views
5

I criteri presentano alcuni vantaggi rispetto all'utilizzo di JPQL o SQL grezzo, come descritto in this answer: sicurezza del tipo; rifattorizzazione cordialità; meno dipendenza dalle stringhe (ma ce ne sono ancora). E uno svantaggio molto grande: sono meno leggibili e semplicemente brutti. Esiste una API Java (non JPA) per l'accesso ai database relazionali che è sia tipicamente leggibile che leggibile?Alternativa più utilizzabile all'API dei criteri

+3

[Un altro ha suggerito di leggere] (http://stackoverflow.com/q/825141/248082) – nobeh

risposta

6

Timo Westkämper ha svolto un buon lavoro con QueryDSL. Questa libreria fornisce una DSL per interrogare provider di persistenza differenti (JPA, MongoDB, Lucene ...).

Ma spesso ho utilizzato soluzioni fatte a mano che semplificano le query più comuni (elencare un'entità che limita alcuni dei suoi campi), impedendomi di scrivere sempre le stesse linee. Per le query più complesse sono passato a Criteria API non leggibile e dettagliata.

2

MyBatis.

MyBatis è un framework di persistenza di prima classe con il supporto per SQL personalizzata, stored procedure e corrispondenze avanzate. MyBatis elimina quasi tutto il codice JDBC e l'impostazione manuale dei parametri e il recupero dei risultati. MyBatis può utilizzare semplici XML o annotazioni per la configurazione e primitive di mappe, interfacce di mappe e POJO Java (Plain Old Java Objects) nei record del database.

Oppure, come nobeh suggested: jOOQ.

+2

A questo proposito, potresti anche dare un'occhiata a [jOOQ] (http://www.jooq.org/) o [JDBI] (http://www.jdbi.org/). – nobeh

+0

jOOQ, sì; JDBI, no - JDBI ha lo stesso affidamento sulle stringhe opache che JPQL fa. –

0

ho trovato "l'ultima" soluzione ad una più facile ricerca di JPA di fronte la seguente classe di utilità: DynamicQueryBuilder

  1. Dà meta modello, in modo che non sarà necessario per descrivere le relazioni utilizzando unisce .

  2. Cerca per modello pojo !!! Basta inserire i valori in un'istanza di entità e saranno utilizzati come criteri!

  3. Utilizza il modello di builder quindi è MOLTO leggibile!

    Banca banca = nuova banca(); bank.setId (12L); bank.setAchCode ("1213"); bank.setCbeCode ("1234"); bank.setStatus (nuove ricerche (1L)); bank.setAchShortName ("121");

    ID elenco = nuovo ArrayList(); ids.add (1); ids.add (2); ids.add (3); ids.add (4); ids.add (5);

    Elenco cbeCodes = new ArrayList(); cbeCodes.add ("1111"); cbeCodes.add ("2222");

    DynamicQueryBuilder queryDyncBuilder1 = nuovo DynamicQueryBuilder.Builder (null) .select (bank) .withOperType (Operator.OperType.AND). withAdvancedParam ("cbeCode", COME, PERCENT_AROUND) .withAdvancedParam ("id", IN, IDS) .withAdvancedParam ("achCode", TRA, cbeCodes) .withAdvancedParam ("achShortName", GT) .orderBy ("id") .orderBy ("cbeCode", true) .orderBy ("status.code", true) .build();

    System.out.println (queryDyncBuilder1.getQueryString());

Se si esegue la chiamata sopra la componente costruirà il seguente risultato di query JPQL:

SELECT b 
FROM Bank b 
WHERE b.status = :status 
AND b.cbeCode LIKE :cbeCode 
AND b.achShortName > :achShortName 
AND b.id IN :id 
AND (b.achCode BETWEEN :achCodeFrom AND :achCodeTo) 
ORDER BY b.status.code DESC, b.id ASC, b.cbeCode DESC 
+0

"Utilizza pattern di builder quindi è MOLTO leggibile" Mi piace QueryDSL un po 'di più in questo senso. –

Problemi correlati