2011-12-27 10 views
10

JPQL kullanıyorum ve Uzun alanda boş değer sorgulamak istiyorum. Ama her zaman bir ORA-00932 alırım: tutarsız veri türleri: beklenen NUMBER BINARY oldu. Gördüğüm gibi, bununla ilgili problemleri olan birçok insan var, ama bunun için bir çözüm var mı?Bir boş değeri null değerinde "Beklenen NUMBER, ancak BINARY var" OracleDB'den almadan nasıl sorgulayabilirim?

Örneğin bu sorgu "SELECT a FROM Auftrag a WHERE :id is null OR a.id = :id" ve setParameter("id", null) .bu ile sonradan ben ayarlıyorum kimliği sütunu filtreyi görmezden bizim durumumuzda amaca, yani boş araçları filtrelemek için daha karmaşık bir sorguda kullanılır.

Bir fikri olan var mı?

Saygılarımızla!

+0

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

+0

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

+0

İkinci durumunuzun tamamen göz ardı edildiğini düşünmüyorum. Bahis, istisna nümerik a.id ile null (: id) – jan

cevap

5

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.

+0

o filtreleme bölümünü ingnore için boş kullanıyorsa:. id null o alacak true olarak bir şey seçin, bu yüzden herhangi bir filtresine sahip olmayacak, ve istediği bu. –

+0

@FlorinGhita: Dürüst olmak gerekirse, SQL standardının ne ile ilgili olduğunu bilmiyorum. _value = NULL' veya Oracle bunu nasıl ele alır, ancak en azından PostgreSQL 9.1'de bu NULL/DOĞRU olarak değil NULL olarak değerlendirilir. Ve afaik, SQL'de DOĞRU VEYA ... gibi bir şeyin kısa devre değerlendirmesi için bir garanti yoktur. Yani, bence böyle bir ifadeden kaçınılmalıdır. Oracle null = null öğesinde – tscho

+0

yanlıştır, bu bir sorun olmamalıdır. –

5

Ben aynı sorunu yaşadım, ben örneğin, ters YA iki tarafın da çözdü:

SELECT a 
FROM Auftrag a 
WHERE :id is null OR a.id = :id 

işe yaramadı, ama böyle ters VEYA yanları:

SELECT a 
FROM Auftrag a 
WHERE a.id = :id OR :id is null 

çalıştı kusursuzca. Nedenini anlamıyorum ama işe yarıyor. Muhtemelen "kısa devre" ile ilgili bir şey vardır, ancak null olması durumunda her iki ifade de değerlendirilir. Umarım birisi bunu açıklayabilir.

+1

Bu WaveMaker 6.7 ile benim için çalıştı. Burada neler oluyor? – anthonybrice

+0

Benim için çalıştı. Mümkünse başka bir çözüm ise Aşağı (null) olur. Örneğin. :: id sıfır veya ALT (a.id) = ALT (: id) ' – William

İlgili konular