Given following entities:
{code:java} @Entity public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@OneToOne(fetch = FetchType.LAZY) @JoinColumn private Chair chair;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Chair getChair() { return chair; }
public void setChair(Chair chair) { this.chair = chair; } } {code}
{code:java} @Entity public class Chair {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@OneToOne( fetch = FetchType.LAZY, mappedBy = "chair") private User user;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Room room;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public Room getRoom() { return room; }
public void setRoom(Room room) { this.room = room; } }
{code}
{code:java} @Entity public class Chair Room {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@ OneToOne OneToMany ( fetch = FetchType.LAZY, mappedBy = " chair room ") private User user;
@ManyToOne(fetch List<Chair> chairs = FetchType.LAZY new ArrayList<>( ) ; @JoinColumn private Room room String name ;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public User getUser List<Chair> getChairs () { return user chairs ; }
public void setUser setChairs ( User user List<Chair> chairs ) { this. user chairs = user chairs ; }
public Room getRoom String getName () { return room name ; }
public void setRoom setName ( Room room String name ) { this. room name = room name ; } } {code}
When I try to retrieve all user and sort by room name, I get only users which have chair and room, but users without chair and room are not retrieved:
{code:java} //work wrong, cross joins Order order2 = cb.asc(root.get("chair").get("room").get("name")); query.orderBy(order2);
users = entityManager.createQuery(query). setHint("javax.persistence.fetchgraph", entityGraph).getResultList();
{code}
The following sql output printed, which contains unexpected cross join filtering null values: {code:java} select user0_.id as id1_2_0_, chair1_.id as id1_0_1_, room2_.id as id1_1_2_, user0_.chair_id as chair_id2_2_0_, chair1_.room_id as room_id2_0_1_, room2_.name as name2_1_2_ from User user0_ left outer join Chair chair1_ on user0_.chair_id=chair1_.id left outer join Room room2_ on chair1_.room_id=room2_.id cross join Room room4_ where chair1_.room_id=room4_.id order by room4_.name asc {code}
|
|