2010-02-12 18 views

cevap

17

ben de aynı sorun var, ve şu şekilde çözmek başardı adres:

return criteria.createCriteria(A.class) 
       .createCriteria("b", "join_between_a_b") 
       .createCriteria("c", "join_between_b_c") 
       .createCriteria("d", "join_between_c_d") 
       .add(Restrictions.eq("some_field_of_D", someValue)); 

Not: kodunda "b", "c" ve "d" yukarıdaki A, B ve C adları atfetme bakın karşılık gelen sınıflar (sınıf A, b özniteliğine sahiptir ve böyle devam eder).

Bu çözüm için, A.hbm.xml numaranızda ayarlanacak lazy ve fetch parametrelerine ihtiyacınız yoktur.

+0

Aşağıdaki SQL'e ne dersiniz ?: A.columnA1, B.columnB1, C.columnC1'i seçin. A'dan B içsel birleşimi A.fk_id = B.id içselleştirme C'nin üzerinde C.fk_id = B.id? – maximilianus

+0

Lütfen bunun için ayrı bir soru açın. – mindas

1

gibi, kriterlerinde getirme moduna ayarlamayı deneyin:

criteria.setFetchMode(..., FetchMode.EAGER) 

Bu join sorgusu oluşturur. Daha fazla bilgiyi here bulabilirsiniz.

2

Hibernate Reference material'da, dış birleştirmeyle ilişkilendirmeleri getirmek için setFetchMode'u kullanan bazı iyi örnekler vardır.

bir örnek: ayrıca size yararlı olabilecek information there about different fetching stragies yoktur

List books = sess.createCriteria(Book.class) 
.setFetchMode("chapters", FetchMode.EAGER) 
.setFetchMode("reviews", FetchMode.EAGER) 
.list(); 

.

+0

Aslında bu benim için çalışmadı, gönderdiğim cevapta olduğu gibi yapmak zorundaydım. Bunun nedeni, "D" üzerinde ek bir ölçüt vardı. – mindas

0

Evet, aslında birçok Bunu yapmanın yolu vardır:

  1. dernek haritalama, false olarak lazyness kurmak ve onun katılmak modunu getir. Bu tüm kriter sorgularını etkileyecektir.
  2. setFetchMode'u diğer yanıtlarla ayrıntılı olarak kullanın.
  3. criteria.createAlias ​​(veya createCriteria) öğesini kullanın. Bu ayrıca, birleştirmek istediğiniz satırları daha fazla kısıtlamanıza da olanak tanır.
İlgili konular