【问题标题】:Handling null in MySQL在 MySQL 中处理 null
【发布时间】:2023-03-12 11:40:01
【问题描述】:

假设我在 MySQL 上有 3 个表:

表 1:Person,包含字段 id 和 name

表 2:产品,带有字段 id 和 name

表 3:交易,包含字段 id、person_id 和 product_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%'
    );

它工作得很好。

但是,在一种情况下它存在错误: 当我有一个 Person 或 Product 为 null 的事务时,即使另一个匹配 sql,它也会返回 null。

假设我有一个名为 ANA CLARA 的人,以及她的 id 和产品为 null 的事务,而不是 SQL 返回 null。

在纯 Mysql 上,我会这样做:

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

如何在 Java 端解决它?

【问题讨论】:

  • 您能否发布几行示例数据,以及您希望从该数据中获得的结果?
  • 这里缺少一些 SQL...事务表似乎没有任何名为 name 的列。我怀疑问题出在其他两个表的内部连接操作上。对于内部联接,如果在其他表之一中找不到匹配行,则查询不会为该事务返回一行。我怀疑我们想要外连接操作,但规范不清楚(示例数据和预期输出会澄清它)......并且显示的语句似乎不是有效的 MySQL 语法。 (我认为问题不在于处理 NULL,问题在于找不到匹配的行。)
  • 您好,感谢您的支持,我已经用生成的 SQL 和我发现的更多内容更新了我的问题

标签: java mysql spring hibernate jpa


【解决方案1】:

试试这个(未测试):

   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)

【讨论】:

  • 工作就像一个魅力!谢谢:)
猜你喜欢
  • 2023-03-29
  • 2011-01-11
  • 2014-06-19
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2014-06-07
相关资源
最近更新 更多