我是否必须在我的 hql 查询中防御性地保护空值?
Do I have to defensively protect nulls in my hql query?
假设我有一家公司,编号为 phone。我可能有潜在客户记录,我想获得 phone 号码的潜在客户。我是否必须先确保我的公司不为空?
选项 1
FROM Lead l WHERE l.company IS NOT NULL AND l.company.phone = :phone
选项 2
FROM Lead l WHERE l.company.phone = :phone
在选项 1 中,我在检查 phone 之前确保公司不为空。在选项 2 中,我假设休眠有办法将其短路。
我试过查找但找不到有关此事实的文档。我也在移动 atm 上,所以这妨碍了我的搜索(和我发布这个!)
不,你不知道。 where l.company.phone = :phone
等同于 inner join l.company c where c.phone = :phone
,内部联接将简单地过滤掉公司为空的实体。
这些查询最终会转换为 SQL 并由数据库执行。他们不使用您的 Java 实体。相应的 SQL 查询看起来像
from lead l, company c where l.company_id = c.id and c.phone = :phone
一个简单的测试就可以让你自己找出答案,顺便说一句。
假设我有一家公司,编号为 phone。我可能有潜在客户记录,我想获得 phone 号码的潜在客户。我是否必须先确保我的公司不为空?
选项 1
FROM Lead l WHERE l.company IS NOT NULL AND l.company.phone = :phone
选项 2
FROM Lead l WHERE l.company.phone = :phone
在选项 1 中,我在检查 phone 之前确保公司不为空。在选项 2 中,我假设休眠有办法将其短路。
我试过查找但找不到有关此事实的文档。我也在移动 atm 上,所以这妨碍了我的搜索(和我发布这个!)
不,你不知道。 where l.company.phone = :phone
等同于 inner join l.company c where c.phone = :phone
,内部联接将简单地过滤掉公司为空的实体。
这些查询最终会转换为 SQL 并由数据库执行。他们不使用您的 Java 实体。相应的 SQL 查询看起来像
from lead l, company c where l.company_id = c.id and c.phone = :phone
一个简单的测试就可以让你自己找出答案,顺便说一句。