Я хочу выполнить 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 различных критериев.
Это кажется смешнымдля меня, поэтому я предполагаю, что должен быть лучший путь.Может кто-то что-то предложить?