2012-11-05 6 views
6

Lambdaj(およびいくつかの他の同様のライブラリが)私はそう(直接lambdaj Featuresページの例)のような述語を定義することができますhaving機能提供:述語をSQLのような文字列として定義するためのJavaライブラリがありますか?

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

を私はかなり私のJavaを定義することができるようにしたいのですが

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

は、このようなライブラリが存在するか、あるいは誰がクエリの構文解析部分のいくつかのビルディング・ブロックをお勧めすることができます: - SQLに似たwhere句 - 単純な文字列構文、"age > 30"使用して述語オブジェクトので、上記フィルタは、何かのようになり、私は共同uldを使って自分自身を作る?私は実際にどのような述語(hamcrest、guavaなど)が作成するのか気にしません。

私の頭の上には、平等と不等式、カスタムとプリミティブの種類、および/またはかっこ、LIKE(文字列の場合)がサポートされています。 、in(...)、enum名の解釈、プロパティのプロパティ。ここで

は、より複雑な述語の例です:

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

は(この例では、クラスは述語が(たとえばSalesPersonクラスに適用されていることを前提と)メソッドgetSalesCount()、はgetCountry()、およびgetCityを持っています()、getAttitude()(enumを返す)、getName()メソッドを持つ型を返すgetProductプロパティもあります。

動機:複数の言語API(現在はJava & C#)を持つクライアントサーバーシステムがあります。私は、ユーザーがサーバー・プロセス(Javaで書かれている)にのみ正確な内容が知られているオブジェクトのセットをフィルタリングする述語を指定するための、言語に依存しない方法を探しています。

+1

あなたのケースでは特にDSLの内部作成について調べてください。 –

+0

このスレッドは役立つかもしれませんhttp://stackoverflow.com/questions/5620985/is-there-any-good-dynamic-sql-builder-library-in-java –

+0

あなたはLINQのように見えないようです存在する(まだ)。たぶんあなたはここに何かを見つけるでしょう:http://stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq –

答えて

2

MVELを見てください。それは同様の表現をサポートしています。

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

は、クライアントからのいくつかの基本的なビジネスルールを表現するために、プロジェクトに一度、それを使用します。

+0

ありがとう!今私は私が "表現言語"を探していることを知っている私はhttp://java-source.net/open-source/expression-languagesで他のものの束を見つけた – bacar

+0

これはまた、いわゆる投影/あなたの場合に役立つ可能性のある折り畳みとフィルタリング: 'familyMembers =(名前は(ファミリーユーザのユーザ)); ' $ .nameに 'foobie'が含まれているとfooListに); –

+0

リンクが壊れています。 – thee

0

このようなライブラリがすでに存在するかどうかは不明ですが、groovyを使用してそのような式をオンザフライでコンパイル/評価することはできます。

関連する問題