我有一个具有以下字段的父母:
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true, orphanRemoval = true)
@JoinColumn(name = "rcp_pf_id_thumbnaildata")
private PersistableFile thumbnailData;
我有一个用于此父级的NamedQuery,如下所示:
@NamedQuery(name = "Recipe.findMetaByRecipeIds", query = "SELECT r.title, r.difficulty, r.rating, r.thumbnailData.filename, r.cookCounter, r.identifier FROM Recipe r "
+ "WHERE r.creationTime <= :maxCreationTime AND r.rcpId IN (:rcpIds) ORDER BY r.title ASC")
如果thumbnailData为null,则由于以下原因,该查询不返回任何内容(尽管结果集中应至少有一个父级):
r.thumbnailData.filename
也许它在内部产生某种NullPointerException,尽管我没有得到任何堆栈跟踪。它什么也没返回。
当我将查询更改为此:
@NamedQuery(name = "Recipe.findMetaByRecipeIds", query = "SELECT r.title, r.difficulty, r.rating, pf.filename, r.cookCounter, r.identifier FROM Recipe r "
+ "LEFT JOIN r.thumbnailData pf WHERE r.creationTime <= :maxCreationTime AND r.rcpId IN (:rcpIds) ORDER BY r.title ASC")
结果按预期工作,并返回一些父母。
尽管取得了工作成果,但我对这种解决方案并不感到放松,因为为什么r.thumbnailData.filename
无效,而pf.filename
有效。由于LEFT JOIN r.thumbnailData pf
的结果也可能为null(内部),因此它是否也应该在内部崩溃,但是当我通过pf.filename
访问此结果时,查询有效吗?这对我来说看起来不太稳定。
我想知道这是否只是巧合,还是做这样查询的正确方法?如果不是,查询应该是什么样(不使用Criteria API)? (顺便说一句:optional = true
似乎对此没有任何影响。)