休眠:使用NamedQuery选择可选子项不会导致任何结果

时间:2018-12-16 12:19:15

标签: hibernate jpa entity named-query

我有一个具有以下字段的父母:

@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似乎对此没有任何影响。)

0 个答案:

没有答案