【发布时间】: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