简体   繁体   English

如何使用 LEFT OUTER JOIN 创建 JPA 查询?

[英]How to create a JPA query with LEFT OUTER JOIN?

I am learning JPA so I want to use mysql query like this我正在学习 JPA 所以我想像这样使用 mysql 查询

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?那么如何将其更改为 jpql 查询代码? Thanks谢谢

If you are using EntityManager you can follow this way如果您使用的是 EntityManager ,您可以按照这种方式

@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:如果您使用 spring 数据 jpa,您可以在存储库层中提供它,例如:

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

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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