Hibernate: выбор необязательного потомка с NamedQuery не приводит к результатам - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть родитель со следующим полем:

@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, возможно, также равен нулю (внутренне), но когда я получаю доступ к результату через pf.filename, запрос работает ?!Это выглядит не очень стабильным для меня.

Я хотел бы знать, работает ли это просто по стечению обстоятельств, или это правильный способ сделать такой запрос?Если нет, то как должен выглядеть запрос (без использования Criteria API)?(Кстати: optional = true, похоже, не влияет на это.)

...