Ibatis / Ibator - Как правильно написать «сложное» предложение WHERE, используя примеры классов и критерии? - PullRequest
0 голосов
/ 15 марта 2012

Я хочу выполнить SELECT с несколькими условиями, используя сгенерированные классы Ibator Example.

Как описано здесь в примечаниях по использованию , довольно просто использовать 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 различных критериев.

Это кажется смешнымдля меня, поэтому я предполагаю, что должен быть лучший путь.Может кто-то что-то предложить?

Ответы [ 5 ]

1 голос
/ 17 октября 2015

Если вы хотите работать со сложными запросами 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 голосов
/ 27 января 2019

Я вижу ниже, это единственный возможный способ сделать это.Вы можете взломать Сгенерированный пример предложения и добавить свой собственный метод равных значений

Пример класса:

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

Использовать пользовательский пример класса Method Как показано ниже:

example.createCriteria().andIntegerIsCustomEqualTo(int);
0 голосов
/ 17 мая 2016

Я понимаю, что это старый поток, но вы можете расширить примеры классов, включив в них isNull, isEmpty и другие часто используемые функции.

0 голосов
/ 08 января 2013

Я также провел много поисков по этому вопросу, но не нашел пути.

Я думаю, что такие функции в примерах / критериях классов должны использоваться во многих случаях для сложных запросов. Было бы лучше, чтобы генератор mybatis мог предоставить это напрямую.

0 голосов
/ 23 апреля 2012

Tl; dr: это невозможно. Смирись с этим.

Я провожу некоторое время, исследуя это, и этот вопрос был размещен здесь более месяца. Кажется, нет никакого способа сделать это с помощью критериев и примеров Ибатора.

Полагаю, это не для этого. Обходной путь: если вам нужны сложные предложения и эффективность, напишите свою собственную логику в SQL_MAP.

Это то, что я в итоге сделал. Если кто-то еще может предложить лучший ответ позже, я приму его.

...