java在mysql中处理null

icnyk63a  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(260)

假设我在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端解决它?

hc2pp10m

hc2pp10m1#

试试这个(未测试):

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)

相关问题