2012-03-15 36 views
0

Ibterの生成されたExampleクラスを使用して、いくつかの条件でSELECTを実行します。Ibatis/Ibator - ExampleクラスとCriteriaを使って "複雑な" WHERE句を正しく書く方法

としては、複数のORAND事業者とWHERE句を構成するcriteria.andFieldIsSomething()example.or(example)を使用するためにかなり簡単です、here in the usage notesを説明しました。

example.createCriteria().andIntegerIsEqualTo(int).andDateIsEqualTo(someday); 
example.or(example.createCriteria().andIntegerIsNull().andDateIsEqualTo(someday)); 
example.or(example.createCriteria().andIntegerIsEqualTo(int).andDateIsNull()); 
example.or(example.createCriteria().andIntegerIsNull().andDateIsNull()); 

をしかし、最初に、それは一種の退屈で冗長だし、それだろう出力次のコード:

私はこれを書くことができ

SELECT * FROM zeTable 
WHERE (integer = int AND date = someday) 
OR (integer IS NULL AND date = someday) 
OR (integer = int AND date IS NULL) 
OR (integer IS NULL AND date IS NULL); 

よりエレガント(そしておそらく効率的な)だろう書き込みの方法:

SELECT * FROM zeTable 
WHERE (integer IS NULL OR integer = int) 
AND (date IS NULL OR date = someday); 

NULLのためのテストは、私はfを防ぎますROMには.andFieldSomethingIn(List values)メソッドを効率的に使用していますが、この例を単純にしておきながら、書くべきコードは5つまたは6つのフィールドを横切ることを暗示しています。

これは私にはばかげているので、もっと良い方法があるはずです。誰かが何か提案することはできますか

答えて

0

Tl; dr:不可能です。それに対処する。

これを調査するのに少し時間を費やしていますが、この質問は1か月以上ここに掲載されています。 IbatorのCriteriaクラスとExampleクラスではこれができないようです。

私の推測では、それは意味がありません。 回避方法:複雑な句と効率が必要な場合は、SQL_MAPに独自のロジックを記述します。

これは私がやったことです。他の誰かが後でより良い答えを提供できるなら、私はそれを受け入れるでしょう。

0

私はこれについて多くの検索をしましたが、決して見つけられませんでした。

複雑なクエリでは、多くの状況でexample/criteriaクラスの関数を使用する必要があると思います。 mybatisジェネレータがこれを直接提供できる方が良いでしょう。

1

あなたは、複雑なSQLクエリで作業したい場合は、

は今、完全な記事を見つけることができない、Beanにこれらのアノテーションとマップの結果を使用してみてくださいが、ここでのアプローチ上のスニペットで異なるデザインアプローチを使用することを検討してください: -

org.apache.ibatis.annotations.Delete; 
org.apache.ibatis.annotations.Insert; 
org.apache.ibatis.annotations.Options; 
org.apache.ibatis.annotations.Param; 
org.apache.ibatis.annotations.Result; 
org.apache.ibatis.annotations.Results; 
org.apache.ibatis.annotations.Select; 

final String SELECT_BY_ID = "SELECT * FROM CONTACT WHERE CONTACT_ID = # 
{id}"; 

/** 
* Returns a Contact instance from the database. 
* @param id primary key value used for lookup. 
* @return A Contact instance with a primary key value equals to pk. null 
if there is no matching row. 
*/ 
@Select(SELECT_BY_ID) 
@Results(value = { 
@Result(property="id"), 
@Result(property="name", column="CONTACT_NAME"), 
@Result(property="phone", column="CONTACT_PHONE"), 
@Result(property="email", column="CONTACT_EMAIL") 
}) 
Contact selectById(int id); 
0

これは古いスレッドですが、isNull、isEmptyなどのよく使用される機能を組み込むようにサンプルクラスを拡張することができます。

関連する問題