У меня есть родитель со следующим полем:
@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
, похоже, не влияет на это.)