2011-06-01 32 views
5

Hibernate kullanarak katılmak, ben koşullarına göre veritabanındaki bir veri güncellemek istediğiniz ama şu hata var: Burada değerini güncelle

benim veritabanı açıklamasıdır "düğüm boş olamaz hareket etmesi":

UPDATE Team t SET t.current = :current LEFT JOIN t.members m WHERE t.current = :current_true AND m.account = :account 

yanlış yapıyorum: Burada

Account: id, email, password 
Member : id, account, team 
Team: id, current (and a reference to member => members) 

benim JPA nedir? i SOL SET önce hiç JOIN taşırsanız:

UPDATE Team t LEFT JOIN t.members m SET t.current = :current WHERE t.current = :current_true AND m.account = :account 

I got:

UPDATE Team t SET t.current = :current WHERE t.current = :current_true AND t.members.account = :account 

aldığım: Ben katılmak kaldırırsanız

"SET bekliyor SOL bulundu" " Kuralsız tahsilat için yasa dışı girişim ".

Değerleri güncelleştirmenin doğru yolu nedir?

Yardımlarınız için teşekkürler!

cevap

7

Bölüm 4'teki JPA 2.0 belirtimi, JPQL'deki tüm desteklenen özelliklerin ayrıntılarını içerir.

aşağıdaki

bu operasyonların sözdizimi gibidir:

update_statement ::= update_clause [where_clause] 
update_clause ::= UPDATE entity_name [[AS] identification_variable] 
        SET update_item {, update_item}* 
    update_item ::= [identification_variable.]{state_field | single_valued_object_field} = 
        new_value 
new_value ::= 
    scalar_expression | 
    simple_entity_expression | 
    NULL 

Gördüğünüz gibi

, çoklu varlıklar için destek burada belirtilmemiştir Bu "güncelleme" ifadesi tanımıdır. Bunu yapmak için farklı bir yol bulmanız gerekecek, belki önce ilk önce güncellemek istediğiniz varlıkları seçen ve sonra değerleri ayarlayan sonuçların üzerinde yineleyen bir yöntem oluşturmalısınız. Veya yerel bir SQL güncellemesi kullanabilirsiniz.

+1

, bitti yineleme için saçma n bunu yapabilecekken veritabanınızda giriş güncelleme yapmak için bir sorgu! (ve bu tek tek JPA içermiyor mu ?!) –

+0

@ cx42net Öyle olsa bile, sorgudaki birleşimin ihtiyacını görmüyorum. Neden üyeler alanını kullanmadan sorguyu Ekip objesi üzerinden yazamazsınız? Sonuçta bir sol birleşim kullanıyorsunuz, sonuç aynı olacak, değil mi? –

+0

Üye, Ekip ve Hesabı bir araya getiriyor ve güncellemeleri hesaplara göre filtrelemem gerekiyor, bu yüzden Üye'ye katılmam gerektiğini düşünüyorum. –

11

bir alt sorgu kullanın: (denenmedi)

bir yerel SQL güncelleme sonra tercih olacağını

UPDATE Team t SET t.current = :current 
WHERE t.id in (select t1.id from Team t1 LEFT JOIN t1.members m WHERE t1.current = :current_true AND m.account = :account) 
+0

Bu, sql içinde bir alt seçime oldukça düzgün bir şekilde çevrilecek ve anahtar bir bileşik anahtar olmadıkça çalışacaktır. – KarlP

+0

Yayınınız için çok teşekkürler. Sorunumu çözdü! – curious1

+0

Evet! Bu çalıştı. Lanet olsun! Bir saniye için endişelendim. Ayrıca bu birleşik katıştırılmış anahtar varsa çalışır – mike