how to retrieve a complex class and its members using hibernate projection

how to retrieve a complex class and its members using hibernate projection  using -'java,sql,hibernate,orm,hibernate-criteria'

I have a class as following that need to retrieve from DB using Hibernate.
The problem is my class has multiple members and majority of them are classes, how can I retrieve them?

public class Student {
  long id;
  String name;
  String fname;
  List<Course> courses;
  Dealer dealer;

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


I need to retrieve student id 1 and all its courses, its dealer and  list of dealers' cars.

My projection is as following but it does not return anything.




asked Oct 7, 2015 by mannumits1
0 votes

4 Answers

0 votes

Because you have a List of Courses and a Set of Cars, you can simply fetch the whole graph in a single query:

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

Because you are fetching two collections, this query will generate a Cartesian Product, so you need to make sure that the selected children collections don't have too many entries.

If you don;t want to run into a Cartesian product, you can simply run this query:

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

and then you access the to fetch that collection with a separate query:

Student s = ...;
answered Oct 7, 2015 by mannar kande
0 votes
    // Projection is not needed, Hibernate will load child values as shown below

    Student student = session.get(Student.class);
    List 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();
answered Oct 7, 2015 by abhi
0 votes

I am not sure if you can use QueryOver but it would be very easy for these kind of tasks.

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

var myStudent = Session.QueryOver(() => student)
.Left.JoinQueryOver(() =>, () => courses)
.Left.JoinQueryOver(() =>, () => dealer)
.Left.JoinQueryOver(() =>, () => car)
.SelectList(list => list
  .Select(() => student.Name)
  .Select(() => student.Age)
  .Select(() => courses.Description)
  .Select(() => dealer.locaiton)
  .Select(() => car.Model))

Create a StudentModel DTO to have the results. This is just a hint to start with, you can modify this according to your requirement. I hope this will work. :)

answered Oct 7, 2015 by maurya
0 votes

If high performences are not a concern, then you should let Hibernate do his work. Just use the getters of you entities. For exemple:

Student student1 = session.get(Student.class, 1L);
List courses = student1.getCourses();
Dealer dealer = student1.getDealer();
Set cars = dealer.getCars();
answered Oct 7, 2015 by vimaldas2005