Обработка нуля в MySQL - PullRequest
0 голосов
/ 30 мая 2018

Допустим, у меня есть 3 таблицы на MySQL:

Таблица 1: Персона, с идентификатором и именем поля

Таблица 2: Продукт, с идентификатором и именем поля

Таблица 3: Транзакция, с полями id, person_id и product_id

Теперь я хочу найти строку, чтобы получить список транзакций, которые похожи на имя человека или название продукта.

Вот как я это делаю (Java-код, использующий hibernate, jpa и spring)

String str_query = "select tr from Transaction tr where 
(tr.person.name like '%ANA%' or tr.product.name like '%ANA%')";

(сгенерированный SQL):

select
    transaction_.id as col1,
    transaction_.product_id as col2,
    transaction_.person_id as col3
from
    transaction transaction_ cross 
join
    person person1_ cross 
join
    product product1_ 
where
    transaction_.person_id=person1_.id 
    and transaction_.product_id=product1_.id 
    and (
        person1_.name like '%ANA%' 
        or product1_.name like '%ANA%'
    );

Работаетна отлично.

Однако есть одно обстоятельство, при котором возникает ошибка: когда у меня есть транзакция, в которой либо Person, либо Product имеет значение null, даже если другая соответствует sql, она возвращает null.

SayУ меня есть человек с именем ANA CLARA и транзакция с ее идентификатором и продуктом NULL, чем SQL возвращает NULL.

На чистом Mysql вот что я бы сделал:

and (transaction_.product_id=product1_.id or 
transaction_.product_id is null)

Как можноЯ решаю это на стороне Java?

1 Ответ

0 голосов
/ 31 мая 2018

Попробуйте это (не проверено):

   SELECT tr 
     FROM Transaction tr
LEFT JOIN tr.person p ON p.name LIKE '%ANA%'
LEFT JOIN tr.product pr ON pr.name LIKE '%ANA%'
    WHERE (NOT p IS NULL) OR (NOT pr IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...