Assume that I have 2 objects A and B One to One related and B is nested under A. B is Lazy initialized and proxied and also I have an Entity Graph to fetch B eagerly when loading A as follows.
@NamedEntityGraph(name = "subGraph",attributeNodes = {@NamedAttributeNode("sub")})
public class A{
Integer id;
String name;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", insertable = false, updatable = false)
B sub;
}
public class B {
int id;
String description;
}
Let us have a stream of A queried from database and we are trying to set a DTO object and add to a DTO list:
1. List<ADto> dtoList = new ArrayList<>();
2.
3. aRepository.streamAll().forEach(a -> {
4. ADto dto = new ADto();
5. dto.setName(a.getName());
6. dto.setSub(a.getB());
7. })
My question is:
If an instance of A does not have B (I mean SQL query with LEFT OUTER JOIN because of Entity Graph returns null fields for B) line 6 performs a second SQL query to database like
SELECT proxy_b_1.id, proxy_b_1.description FROM b as proxy_b_1;
Actually we already know that instance B under that specific instance A does not have value. It is shown also on debug mode. But why it makes a second SQL query? How can I mitigate this? I mean If I make an entity graph query that is enough for me if nested B exists. If does not exist do not perform an extra query. How can I do that?