假设我在mysql上有3个表:
表1:person,带有id和name字段
表2:product,带有id和name字段
表3:事务,带有字段id、人员id和产品id
现在,我想搜索一个字符串,得到一个交易列表,其中人名或品名与之相似。
我是这样做的(使用hibernate、jpa和spring的java代码)
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%'
);
它工作得非常好。
然而,有一种情况下它有一个bug:当我有一个事务,其中一个person或product为null时,即使另一个匹配sql,它也返回null。
假设我有一个名为anaclara的人和一个id和product为null的事务,sql返回null。
在纯mysql上,我会这样做:
and (transaction_.product_id=product1_.id or
transaction_.product_id is null)
如何在java端解决它?
1条答案
按热度按时间hc2pp10m1#
试试这个(未测试):