简体   繁体   中英

How to create a JPA query with LEFT OUTER JOIN?

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

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'

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();

    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM