JPQL'nin özelliklerini ve Oracle'ın sorgunuzun WHERE koşulunu nasıl işlediğini bilmiyorum. Ama bahse girerim WHERE durumunuzun ikinci kısmı tamamen yok sayılmaz ve bu a.id = NULL
soruna neden oluyor. Görünürde tutarsız veri türleri dışında some_value = NULL
gibi bir koşul DOĞRU veya YANLIŞ, ancak NULL (en azından bu PostgreSQL üzerinde olur) değerlendirmeyebilir.
PostgreSQL üzerinde amaçlandığı gibi kombine koşul :id IS NULL OR a.id = NULL
hala çalışır Spesifik kullanım örneğiniz için DÜZENLEME
. Ancak başka bir bağlamda, some_value
boş olsa bile some_value = NULL
ile satır almazsınız. Bu yüzden, sağlam ve anlaşılabilir bir kod uğruna, her durumda some_value = NULL
gibi bir ifadeden kaçınılması gerektiğini düşünüyorum.
SON DÜZENLEME
Sen
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
ile JPQL soruna mümkün olabilir en azından bu yerli Hibernate HQL ile mümkündür. Bu durumda, WHERE koşulunun ikinci kısmı, :id
boşsa YANLIŞ olarak değerlendirir, ancak tüm WHERE koşulu, TRUE olarak değerlendirir;
Ancak dinamik filtreleme sorguları için JPA 2.0 Kriteri API'sini kullanmak ve sorguda yalnızca boş değilse :id
parametresini eklemek daha iyi bir yaklaşım olacaktır. Yine, JPA Kriterleri özelliklerini bilmiyorum ama yerli Hazırda Kriterleri ile bu yardımcı olur
public List<Auftrag> findByFilter(Long id) {
Criteria criteria = session.createCriteria(Auftrag.class);
if (id != null) {
criteria.add(Restrictions.eq("id", id));
} // if
return criteria.list();
}
Umut olurdu.
Auftrag sınıfı neye benziyor? Ayrıca, SQL sözdizimi yanlış görünüyor ("id null nerede", "burada: id null" ...), ayrıca, id = null yanlış bir mantık da. – someuser2
gerçekten değil.her şeyden önce bu SQL değil ama JPQL (bazı küçük farklılıklar vardır) ve eğer ayarlamak isterseniz: null için id ve koşul doğru yazmalısınız "yazmak null". Ortaya çıkan deyim bu durumda "null null" olur ve bu doğrudur, dolayısıyla ikinci koşul göz ardı edilir. – MikeO
İkinci durumunuzun tamamen göz ardı edildiğini düşünmüyorum. Bahis, istisna nümerik a.id ile null (: id) – jan