2015-04-17 7 views
12

Hazırda bekletme modunu kullanarak DB'den alınması gereken bir sınıfım var. Sorun, sınıfımın birden çok üyesi var ve bunların çoğunluğu sınıflar, onları nasıl alabilirim?Karma bir sınıfı ve üyelerini Hazırda Bekleme Projeksiyonu kullanarak nasıl alırım?

@Entity 
public class Student { 
    @Id 
    long id; 
    String name; 
    String fname; 
    @OneToMany 
    List<Course> courses; 
    @ManyToOne 
    Dealer dealer; 
    ... 
} 

@Entity 
public class Dealer { 
    @Id 
    long id; 
    String name; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "cr.dealer", cascade = CascadeType.ALL) 
    Set<Car> cars = new HashSet<Cars>(0); 
    .. 

} 

Öğrenci kimliği 1 ve tüm derslerini kendi bayi ve bayi arabaların listesini almak gerekir.

Projeksiyonum şu şekildedir ancak hiçbir şey döndürmez. yüksek performansına kadar bir endişe değilseniz

... 
    .setProjection(Projections.projectionList() 

    .add(Projections.property("friends.cars").as("cars") 
    ... 

cevap

1

Eğer Kursları Listesini ve Otomobil bir Set Çünkü, sadece tek bir sorguda bütün grafiği getirebilir:

select s 
from Student s 
left join fetch s.courses 
left join fetch s.dealer d 
left join fetch d.cars 
where s.id = :id 

iki koleksiyon getirilirken olduğundan, Bu sorgu bir Kartezyen Ürün oluşturacaktır, bu yüzden seçilen çocuk koleksiyonlarının çok fazla girişi olmadığından emin olmalısınız.

Eğer; t bir Kartezyen ürün haline çalıştırmak istediğiniz, sadece bu sorguyu çalıştırabilirsiniz: Ayrı bir sorgu ile bu koleksiyonu getirmesi

select s 
from Student s 
left join fetch s.courses 
left join fetch s.dealer d 
where s.id = :id 

ve sonra dealer.cars eriş:

Eğer QueryOver kullanabilirsiniz ama görevlerin bu tür için çok kolay olurdu eğer
Student s = ...; 
s.getDealer().getCars().size(); 
+0

Cevabınız için teşekkürler, http://stackoverflow.com/questions/29980421/how-to-retireve-a-set-member-objects-using-hibernate – Jack

0

, o zaman hazırda görevini yapmasına izin gerekir. Sadece varlığınızın alıcılarını kullanın. Exemple için :

Student student1 = session.get(Student.class, 1L); 
List<Course> courses = student1.getCourses(); 
Dealer dealer = student1.getDealer(); 
Set<Car> cars = dealer.getCars(); 
+1

Teşekkürler ama yüksek performans düşünülmelidir. – Jack

4
// Projection is not needed, Hibernate will load child values as shown below 

    Student student = session.get(Student.class); 
    List<Course> courses = student.getCourses(); 
    Dealer dealer = student.getDealer(); 

    // If u want records only where child records are present, u can use LEFT_OUTER_JOIN 

    Criteria criteria = getHibernateSession().createCriteria(Student.class); 
    criteria.createAlias("Course", "Course", JoinType.LEFT_OUTER_JOIN); 

    // If u want to use Projections for performance, u have to add each and every column in projection 

    Criteria criteria = getHibernateSession().createCriteria(A.class); 
    criteria.createAlias("b", "b", JoinType.INNER_JOIN); 
    criteria.createAlias("b.r", "b.r", JoinType.INNER_JOIN); 
    criteria.createAlias("b.c", "b.c", JoinType.LEFT_OUTER_JOIN); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
+0

adresindeki cevabımıza bir göz atabilir misiniz? Cevabınız için teşekkürler , Bu konuyla ilgili yeni bir sorunum var ve bu konu için yeni bir soru gönderdik lütfen bir göz atın, http://stackoverflow.com/questions/29980421/how-to-retireve-a-set-list-of-member-objects Bölme -Mobil-uyku – Jack

0

emin değilim.

Student student = null; 
Dealer dealer = null; 
Course course = null; 
Car car = null; 

var myStudent = Session.QueryOver<Student>(() => student) 
.Left.JoinQueryOver(() => student.courses,() => courses) 
.Left.JoinQueryOver(() => student.dealer,() => dealer) 
.Left.JoinQueryOver(() => dealer.cars,() => car) 
.SelectList(list => list 
    .Select(() => student.Name) 
    .Select(() => student.Age) 
    .Select(() => courses.Description) 
    .Select(() => dealer.locaiton) 
    .Select(() => car.Model)) 
    .TransformUsing(Transformers.AliasToBean<StudentModel>()) 
    .List<StudentModel>().AsQueryable(); 

Sonuçlara sahip olmak için bir StudentModel DTO oluşturun. Bu sadece başlamak için bir ipucu, ihtiyacınıza göre bunu değiştirebilirsiniz. Umarım bu işe yarar.

İlgili konular