Ibatis / Ibator - 如何使用Example类和Criteria正确编写“复杂”WHERE子句?

时间:2012-03-15 09:38:07

标签: java ibatis ibator

我想使用Ibator生成的Example类来执行具有多个条件的SELECT

如[{3}}所述,使用criteria.andFieldIsSomething()example.or(example)与多个WHEREOR运算符组成AND子句相当容易

我可以这样写:

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个不同的标准。

这对我来说似乎很荒谬,所以我认为必须有更好的方法。有人可以建议吗?

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

Tl;博士:是不可能的。处理它。

我花了一些时间来调查这个,这个问题在这里发布了一个多月。似乎没有办法与Ibator的Criteria和Example课程相提并论。

我的猜测是,它不是那个意思。 解决方法:如果您需要复杂的子句和效率,请在SQL_MAP中编写自己的逻辑。

这就是我最终要做的事情。如果其他人可以在以后提供更好的答案,我会接受它。

答案 2 :(得分:0)

我也对此做了很多搜索,但没有找到办法。

我认为示例/条件类中的这些函数应该在许多情况下用于复杂查询。 mybatis生成器可以直接提供它。

答案 3 :(得分:0)

我知道这是一个旧线程,但您可以扩展示例类以包含isNull,isEmpty和其他常用功能。

答案 4 :(得分:0)

我看到以下是执行此操作的唯一可能方法。 您可以修改生成的示例子句并添加自己的自定义equal方法

示例类:

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

使用自定义示例类方法,如下所示:

example.createCriteria().andIntegerIsCustomEqualTo(int);