2011-08-25 10 views
16

Bu, ben benim durumdur iki temel POJO en basit bir hazırda eşleme verdik hangi: hazırda Yerli SQL Sorgusu alınırken kurum ve koleksiyonları

:

Person 
    - PersonId 
    - Name 
    - Books 

Book 
    - Code 
    - Description 

My SQL Sorgu şuna benzer satırları döndürür

PERSONID NAME  CODE DESCRIPTION 
-------- ---------- ---- ----------- 
1  BEN  1234 BOOK 1 
1  BEN  5678 BOOK 2 
2  JOHN  9012 BOOK 3 

Benim hazırda sorgu şuna benzer:

session.createSQLQuery("select personid, name, code, description from person_books") 
     .addEntity("person", Person.class) 
     .addJoin("book", "person.books") 
     .list(); 

budur 18.1.3 hazırda belgelerin: Bölüm başına ne listemde almak için beklemek 2 Kişi kitapların koleksiyonunda bulunan kitap nesnelerle Nesneleri olduğunu http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464

:

List 
|- Ben 
| |- Book 1 
| '- Book 2 
'- John 
    '- Book 3 

Ne aslında görüyorum şudur:

List 
|- Object[] 
| |- Ben 
| | |- Book 1 
| | '- Book 2 
| '- Book 1 
|- Object[] 
| |- Ben 
| | |- Book 1 
| | '- Book 2 
| '- Book 2 
'- Object[] 
    |- John 
    | '- Book 3 
    '- Book 3 

kimse ben bu yöntemi kullanarak istediğini elde etmek mümkünse biliyor mu ?

cevap

1

Sorgunuz person_books yerine, kullanıcı masasında mı olmalı? Benim için

session.createSQLQuery("select * from person") 
    .addEntity("person", Person.class) 
    .addJoin("book", "person.books") 
    .list(); 
+0

Bu örneği özlü olması için basitleştirdim. Benim gerçek kullanımda "person_books" karmaşık bir sorundur, hibernate sorgusunda sağlamadan bir "kitap" için bilgi alma yolu yoktur. Kişi için çok sayıda satır alıyorum ve her Kişi için Kitapları bulmak için fazladan bir sorgulama yapmak zorunda kalmamayı tercih ediyorum. Eğer bir çözüm bulamıyorsam muhtemelen bu yöntemi kullanacağım, ancak Kişinin değişmediği satırlar üzerinden atlayacağım. – Ben

12

aşağıdaki çalışır:

session.createSQLQuery("select p.*, b.* from person p, book b where <complicated join>"). 
.addEntity("person", Person.class).addJoin("book", "person.books").list(); 

Bu Person listesini içeren bir Object[] döndürür Book s listesini içeren her biri. Bunu tek bir SQL seçiminde yapar. Bence senin problemin, kişiyi özel olarak bir şeyle taklit etmemen.

DÜZENLEME: Yöntem bir nesne [] döndürür, ancak dizi Kişiler örnekleri ve yalnızca Kişi örnekleri ile doldurulur.

Hazırda Bekletme, sınıflarınıza nasıl harita verileceğini anlamıyorsa veya birleştirmeyi nasıl eşleyeceğini bilmiyorsa, nesne listesi döndürür. Her satıra yalnızca bir tane Person/Book kombinasyonuna sahip olduğunuzdan emin olun.

+0

Beklediğim şey, Kişinin bir listesiydi, birden fazla kitaba sahip olduklarında, insanların kopyalarını içeren Nesne [] listesi değil. Hazırda bekleyen jira hata raporunun bağlantısını görmek için cevabımı inceleyin. – Ben

+0

Üzgünüm, kendimi netleştirmek için, yöntem bir Nesne [] döndürür, ancak dizi Kişi ve yalnızca Kişi ile doldurulur. Orada hiç kitap yok. –

1

AFAIK, bir SQL sorgusundan "birleşmiş" bir varlık almak mümkün değildir. Sadece bir nesne dizisini geri alacaksınız. Bu durumda yaptığım şey, birleşik nesnelerim için, argüman olarak bir dizi nesne alan yeni bir kurucu oluşturmuş olmama neden oldu. Sonra bunu elle yaptım.

33

Mathews'da genişletme yanıtı. sadece kişilerin listesini döndürmek için hazırda zorlamak için yapın:

List<Person> peopleWithBooks = session.createSQLQuery(
    "select {p.*}, {b.*} from person p, book b where <complicated join>"). 
    .addEntity("p", Person.class) 
    .addJoin("b", "p.books") 
    .addEntity("p", Person.class) 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list(); 

İlişkili Kitap kişiler getirilen ve db bir ek çağrısı olmadan başlatıldı olacak.

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

son varlık ekledi çalışır çünkü

yinelenen

.addEntity("p", Person.class) 

gereklidir.

+1

Bu, Kişi ve Kitap için her şeyi alır. Performansı iyileştirmek için yalnızca belirli özellikleri seçmek isterseniz. * Veya p. * Dışında bir şey anladığım gibi çalışmıyor. – T3rm1

+1

'{p. *} 'Nı kullanarak, {b. *}' Ayrıca' kitaplar 'için ek bir alt seçim sorunu giderir. –