2012-11-05 4 views
6

Lambdaj (und einige andere ähnliche Bibliotheken) eine having Funktion, die mir Prädikate zu definieren, wie so (zB direkt aus der lambdaj Features Seite) erlaubt:Gibt es eine Java-Bibliothek zum Definieren von Prädikaten als SQL-ähnliche Strings?

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends); 

ich meine Java zu definieren, in der Lage sein möchten, ganz Prädikat-Objekt einen einfachen String-Syntax, "age > 30" - ähnlich einer SQL where-Klausel - so über den Filter wird so etwas wie:

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends); 

Gibt es eine solche Bibliothek vorhanden sein, oder können einige Bausteine ​​für die Abfrage Parsen Teil jedem empfehlen Ich co Kann ich selbst einen bauen? Mir ist es egal, welche Art von Prädikat (Hamcrest, Guave usw.) es erzeugt.

Aus der Spitze meines Kopfes kann ich an eine Reihe von Dingen denken, die es fantastisch wäre, zu unterstützen: Gleichheiten und Ungleichungen, auf benutzerdefinierten und primitiven Typen und/oder /, Klammern, LIKE (für Strings) , in(...), Interpretation von Namen, Eigenschaften von Eigenschaften.

Hier ist ein Beispiel einer komplexeren Prädikat:

"salesCount > 10 and (country='UK' or city='New York') 
and attitude not in (MENACING, RUDE) 
and product.name <> 'Widget' " 

(Dieses Beispiel setzt voraus, dass die Klasse das Prädikat angewendet wird (sagen wir eine SalesPerson Klasse) Methods getSalesCount() hat, getCountry() und getCity(), sowie getAttitude() (die eine enum zurückgibt), hat auch eine Eigenschaft getProduct, die einen Typ mit der Methode getName zurückgibt.

Motivation: Wir haben ein Client-Server-System, das mehrere Sprachen-APIs hat (derzeit Java & C#); Ich suche nach einer sprachunabhängigen Möglichkeit für einen Benutzer, ein Prädikat anzugeben, das nach einer Menge von Objekten filtert, deren genaue Inhalte nur dem Serverprozess bekannt sind (der in Java geschrieben ist).

+1

Untersuchen Sie über die Erstellung von DSLs besonders Intern in Ihrem Fall. –

+0

Dieser Thread könnte http://stackoverflow.com/questions/5620985/is-there-any-good-dynamic-sql-builder-library-in-java –

+0

Sie scheinen nach etwas wie LINQ suchen, die nicht scheint existieren (noch). Vielleicht finden Sie hier etwas: http: //stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq –

Antwort

2

Ich würde einen Blick auf MVEL geben. Es unterstützt Ausdrücke der wie:

(user.name == 'John Doe') && ((x * 2) - 1) > 20

es einmal an einem Projekt verwendet, um einige grundlegende Geschäftsregeln von einem Client zum Ausdruck bringen.

+0

Danke! Nun, da ich weiß, dass ich nach einer "Ausdruckssprache" suche, habe ich eine Menge anderer Sachen unter http://java-source.net/open-source/expression-languages ​​gefunden. – bacar

+0

Es unterstützt auch die sogenannten Projektionen/Falten und Filtern, die in Ihrem Fall nützlich sein könnten: 'familyMembers = (Name in (familyMembers in Benutzer));' ' ' ($ in fooList, wenn $ .name 'foobie' enthält); ' –

+0

Der Link ist kaputt. – thee

0

Nicht sicher, ob eine solche Bibliothek bereits existiert, aber Sie können groovy verwenden, um solche Ausdrücke im laufenden Betrieb zu kompilieren/auszuwerten.

Verwandte Themen