我想使用Ibator生成的Example类来执行具有多个条件的SELECT
。
如[{3}}所述,使用criteria.andFieldIsSomething()
和example.or(example)
与多个WHERE
和OR
运算符组成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个不同的标准。
这对我来说似乎很荒谬,所以我认为必须有更好的方法。有人可以建议吗?
答案 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);