I have a complex JPA/Hibernate problem.
I have two entities A and B. A references B, but this relationship is not required.
public class A {
@JoinColumn(name = "b_id", referencedColumnName = "b_id")
@OneToOne
private B b;
}
I write SELECT NEW dto(a.b) FROM A a this generates inner join, which isn’t good for me, because a.b can be null and I want all of the A entites. So I rewrite my query like this: SELECT NEW dto(b) FROM A a LEFT JOIN B b We have to use alias (b) to prevent inner join and get only the outer join. Ok I get all line, but I get extra queries, Hibernate generates SELECT queries for all of B entities. Why, how can I stop this, I use left join, because I want only one query.
Edit:
The same problem with inner joins. If use SELECT NEW dto(a.b) FROM A a additional SELECT b FROM B b WHERE b.id = ? occures, but if I call SELECT NEW dto(a.b.id) FROM A a there isn’t additional select for B entites.
Edit2:
This is exactly same as my problem: Same problem, without possible solution.
Because I don’t load the parent object itself, Hibernate doesn’t load eagerly B…
Now I know what was caused the problem, and I also know the solution.
The partially solution is to use hibernate’s
setResultTransformermethod. Unfortunatelly JPA doesn’t support it…