0

SELECTIbatorで生成されたExampleクラスを使用して、いくつかの条件でを実行したいと思います。

ここで使用上の注意で説明されているように、複数の演算子を使用criteria.andFieldIsSomething()して句example.or(example)を作成するのは非常に簡単です。WHEREORAND

私はこれを書くことができます:

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は、メソッドを効率的に使用できません。.andFieldSomethingIn(List values)この例は単純にしていますが、作成する必要のあるコードは、そのような5つまたは6つのフィールドを交差させることを意味し、36の異なる基準に達する可能性があります。

これは私にはばかげているように思われるので、もっと良い方法があるに違いないと思います。誰かが何かを提案できますか?

4

5 に答える 5

1

Tl; dr:それは不可能ですか。それに対処します。

私はこれを調査するためにしばらく時間を費やしました、そしてこの質問は1ヶ月以上ここに投稿されました。IbatorのCriteriaクラスとExampleクラスではこれを行う方法がないようです。

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

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

于 2012-04-23T10:00:34.750 に答える
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);
于 2015-10-16T23:26:21.567 に答える
0

私もこれについてたくさんの検索をしましたが、方法が見つかりませんでした。

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

于 2013-01-08T08:06:56.857 に答える
0

これは古いスレッドだと思いますが、サンプルクラスを拡張して、isNull、isEmpty、およびその他の頻繁に使用される機能を含めることができます。

于 2016-05-17T17:13:58.360 に答える
0

これを行うための唯一の可能な方法は以下のとおりです。生成されたサンプル句をハックして、独自のカスタムequalメソッドを追加できます

クラスの例:

andIntegerIsCustomEqualTo(int){
  addCriterion("(integer is null OR integer="+int+")");
}

カスタムサンプルクラスメソッドを使用する以下のように:

example.createCriteria().andIntegerIsCustomEqualTo(int);
于 2019-01-27T15:05:20.307 に答える