Reputation: 337
I am learning JPA so I want to use mysql query like this
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1 LEFT
JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ROOT'
so how to change this to jpql query code? Thanks
Upvotes: 3
Views: 1965
Reputation: 6216
If you are using spring data jpa , you could provide it in the repository layer like :
@Repository
public interface CategoryRepository extends JpaRepository<Category, Integer> {
@Query( value =
"SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ROOT'",
nativeQuery = true)
List<Category> fetchCategoryDataLeftJoin();
}
Upvotes: 1
Reputation: 1250
If you are using EntityManager you can follow this way
@PersistenceContext private EntityManager entityManager;
StringBuilder sb = new StringBuilder();
sb.append("SELECT t1.name , t2.name , t3.name , t4.name
FROM category t1 LEFT
JOIN category t2 ON t2.parent = t1.category_id
LEFT JOIN category t3 ON t3.parent = t2.category_id
LEFT JOIN category t4 ON t4.parent = t3.category_id
WHERE t1.name = :name"); // :name - you can pass parameter here
Query q = entityManager.createQuery(sb.toString());
q.setParameter("name", "ROOT");//Root is the value and name is the parameter
Remove the alias from query and run it
select t1.name , t2.name , t3.name , t4.name
from category t1 left
join category t2 ON t2.parent = t1.category_id
left join category t3 ON t3.parent = t2.category_id
left join category t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ROOT'
Upvotes: 0