Допустим, у меня есть 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?