0

我想SELECT使用 Ibator 生成的示例类执行几个条件。

使用说明中所述,它非常易于使用criteria.andFieldIsSomething(),并且可以使用多个和运算符example.or(example)组成一个WHERE子句。ORAND

我可以这样写:

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

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

4

5 回答 5

1

Tl;博士:这不可能吗?处理它。

我花了一些时间调查这个问题,这个问题在这里发布了一个多月。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 generator能直接提供这个。

于 2013-01-08T08:06:56.857 回答
0

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

于 2016-05-17T17:13:58.360 回答
0

我在下面看到是唯一可能的方法。您可以破解 Generated Example Clause 并添加您自己的自定义 equal 方法

示例类:

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

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

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