2012-04-12 16 views
5

Die Kriterien haben einige Vorteile gegenüber der Verwendung von JPQL oder Raw SQL, wie in this answer beschrieben: type safety; Refactoring Freundlichkeit; weniger Abhängigkeit von Strings (aber es gibt immer noch einige). Und ein sehr großer Nachteil: Sie sind weniger lesbar und einfach hässlich. Gibt es eine (nicht-JPA) Java-API für den Zugriff auf relationale Datenbanken, die sowohl typsicher als auch lesbar ist?Mehr verwendbare Alternative zur Kriterien-API

+3

[Eine andere vorgeschlagene lesen] (http://stackoverflow.com/q/825141/248082) – nobeh

Antwort

6

Timo Westkämper hat mit QueryDSL einen guten Job gemacht. Diese Bibliothek bietet eine DSL für die Abfrage verschiedener Persistenz-Provider (JPA, MongoDB, Lucene ...).

Aber ich habe oft handgemachte Lösungen verwendet, die die meisten gängigen Abfragen vereinfachen (eine Entität auflisten, die einige ihrer Felder einschränkt), was mich daran hindert, immer dieselben Zeilen zu schreiben. Bei den meisten komplexen Abfragen bin ich zu einer nicht lesbaren und ausführlichen Kriterien-API gewechselt.

2

MyBatis.

Mybatis ist ein First-Class-Persistenz-Framework mit Unterstützung für benutzerdefinierte SQL, Stored Procedures und erweiterte Zuordnungen. MyBatis eliminiert fast den gesamten JDBC-Code und die manuelle Einstellung von Parametern und das Abrufen von Ergebnissen. MyBatis kann einfache XML- oder Annotationsfunktionen für Konfigurations- und Map-Primitive, Map-Interfaces und Java POJOs (Plain Old Java Objects) für Datenbank-Datensätze verwenden.

Oder wie nobeh suggested: jOOQ.

+2

In diesem Zusammenhang sollten Sie sich auch [jOOQ] (http://www.jooq.org/) oder [JDBI] (http://www.jdbi.org/) ansehen. – nobeh

+0

jOOQ, ja; JDBI, nein - JDBI vertraut genauso auf undurchsichtige Strings wie JPQL. –

0

Ich habe gefunden, „die ultimative“ Lösung für eine einfache JPA-Suche in der Fläche der folgenden Utility-Klasse: DynamicQueryBuilder

  1. Es Meta-Modell gibt, so dass Sie die Beziehungen beschreiben Joins nicht müssen .

  2. Es sucht nach Vorlage pojo !!! Einfach die Werte in eine Instanz einfügen und sie werden als Kriterien verwendet!

  3. Es verwendet Builder-Muster, so dass es sehr lesbar ist!

    Bankbank = neue Bank(); bank.setId (12L); bank.setAchCode ("1213"); bank.setCbeCode ("1234"); bank.setStatus (neue Lookups (1L)); bank.setAchShortName ("121");

    Liste ids = new ArrayList(); IDS.add (1); IDS.add (2); IDS.add (3); ids.add (4); IDS.add (5);

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

    DynamicQueryBuilder queryDyncBuilder1 = neuer DynamicQueryBuilder.Builder (null) .select (Bank) .withOperType (Operator.OperType.AND). withAdvancedParam ("cbeCode", LIKE, PERCENT_AROUND) .withAdvancedParam ("ID", IN, IDs) .withAdvancedParam ("achCode", BETWEEN, cbeCodes) .withAdvancedParam ("achShortName", GT) .orderBy ("id")) .orderBy ("cbeCode", true) .orderBy ("status.code", true) .build();

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

Wenn Sie führen Sie den obigen Aufruf der Komponente wird die folgende Folge JPQL Abfrage erstellen:

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

"Es verwendet Builder-Muster, so dass es sehr lesbar ist" Ich mag QueryDSL in dieser Hinsicht ein bisschen mehr. –