Hibernate why don't use JOIN in sql query on navigation property. (I used spring-boot)
When I used following code two times SELECT query running. I expect it to do it in a single sql statement.
List articles = articleRepository.findByUserId(userId);
Hibernate: select a1_0.id,a1_0.creation_date,a1_0.text,a1_0.update_date,a1_0.user_id from articles a1_0 where a1_0.user_id=?
Hibernate: select u1_0.id,a1_0.user_id,a1_0.id,a1_0.creation_date,a1_0.text,a1_0.update_date,u1_0.creation_date,u1_0.is_active,u1_0.name,u1_0.surname,u1_0.update_date,u1_0.username from users u1_0 left join articles a1_0 on u1_0.id=a1_0.user_id where u1_0.id=?
When I use the code below a SELECT query is created, JOIN is used and it works fine.
User user = userRepository.findById(userId).get();
Hibernate: select u1_0.id,a1_0.user_id,a1_0.id,a1_0.creation_date,a1_0.text,a1_0.update_date,u1_0.creation_date,u1_0.is_active,u1_0.name,u1_0.surname,u1_0.update_date,u1_0.username from users u1_0 left join articles a1_0 on u1_0.id=a1_0.user_id where u1_0.id=?
My Entities are "User" and "Article"
@Entity
@Table(name = "USERS")
@Getter
@Setter
public class User extends BaseEntity {
private String name;
private String surname;
private String username;
private boolean isActive = Boolean.TRUE;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
private List<Article> articles;
}
@Entity
@Table(name = "ARTICLES")
@Getter
@Setter
public class Article extends BaseEntity {
private String text;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "user_id")
private User user;
}
My Repositories are "UserRepository" and "ArticleRepository"
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Integer> {
List<Article> findByUserId(int id);
}
Creating a single SQL query using relationships between Hibernate Entities such as 1:M, M:1, 1:1