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
risposta
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.
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.
A questo proposito, potresti anche dare un'occhiata a [jOOQ] (http://www.jooq.org/) o [JDBI] (http://www.jdbi.org/). – nobeh
jOOQ, sì; JDBI, no - JDBI ha lo stesso affidamento sulle stringhe opache che JPQL fa. –
ho trovato "l'ultima" soluzione ad una più facile ricerca di JPA di fronte la seguente classe di utilità: DynamicQueryBuilder
Dà meta modello, in modo che non sarà necessario per descrivere le relazioni utilizzando unisce .
Cerca per modello pojo !!! Basta inserire i valori in un'istanza di entità e saranno utilizzati come criteri!
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
"Utilizza pattern di builder quindi è MOLTO leggibile" Mi piace QueryDSL un po 'di più in questo senso. –
- 1. I criteri di ibernazione richiedono più criteri
- 2. COUNTIF con più criteri
- 3. Implementazione SVM più veloce utilizzabile in Python
- 4. SQL: più affermazioni con più criteri
- 5. Criteri IMAP con più OR
- 6. Parent(), alternativa più veloce?
- 7. Alternativa più rapida a ColorConvertOp
- 8. alternativa più veloce a Beep di windows.h()
- 9. dimensione dello schermo utilizzabile
- 10. Seleziona su più criteri con XPath
- 11. aggiornamento più righe utilizzando criteri di Hibernate
- 12. Come posso gestire più criteri OrderByDescending?
- 13. R intersect data.frame su più criteri
- 14. C# Classificazione degli oggetti, più criteri
- 15. Checkbox vs Two Radio Buttons - Quale è più utilizzabile?
- 16. C# alternativa delle migrazioni dei binari
- 17. Stile pagina: alternativa all'utilizzo dei galleggianti
- 18. Come partecipare su più criteri, restituendo tutte le combinazioni di entrambi i criteri
- 19. Percorso directory utilizzabile in iOS
- 20. Come si costruiscono le espressioni "WHERE ... IN" a più colonne usando l'API dei criteri di JPA?
- 21. Esposizione dei criteri di ibernazione tramite l'API di servizio
- 22. Dichiarazione LINQ inaffidabile con più criteri di ricerca
- 23. Riutilizzo parte della chiusura dei criteri di Grails
- 24. Android: Alternativa per context.getDrawable()
- 25. Python più veloce alternativa al dizionario?
- 26. Reflector non sarà più libero. Qualche alternativa?
- 27. Criteri di filtro SQL nei criteri di join o clausola where che è più efficiente
- 28. È @ font-face utilizzabile ora?
- 29. Dove posizionare il file dei criteri dell'applet java?
- 30. Converti HQL hibernate con collection.size in query dei criteri
[Un altro ha suggerito di leggere] (http://stackoverflow.com/q/825141/248082) – nobeh