Spring Data:查询注释中是不是可以有子查询?
Posted
技术标签:
【中文标题】Spring Data:查询注释中是不是可以有子查询?【英文标题】:SpringData : is it possible to have subqueries in the Query annotation?Spring Data:查询注释中是否可以有子查询? 【发布时间】:2012-04-02 08:02:44 【问题描述】:我想知道是否可以在@Query 注释中包含子查询(org.springframework.data.jpa.repository.Query;)
我在第一个子查询括号中收到 QuerySyntaxException。
这是我的查询
@Query(value="select c1 from ComplaintModel c1, "
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 "
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 "
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate")
谢谢!
【问题讨论】:
不是Spring Data,相信JPQL也做不到。 【参考方案1】:不,JPQL 查询的 select 子句中不能有子查询。
JPQL 支持 WHERE 和 HAVING 子句中的子查询。它可以(至少)是 ANY、SOME、ALL、IN、EXIST 表达式的一部分,当然也可以使用普通的条件表达式:
SELECT a
FROM A a
WHERE a.val = (SELECT b.someval
FROM B b
WHERE b.someotherval=3)
【讨论】:
【参考方案2】:我确实在 Spring-data jpa 中得到了预期的结果
public final static String FIND_BY_ID_STATE = "SELECT a FROM Table1 a RIGHT JOIN a.table2Obj b " +
"WHERE b.column = :id" +
"AND a.id NOT IN (SELECT c.columnFromA from a.table3Obj c where state = :state)";
@Query(FIND_BY_ID_STATE)
public List<Alert> findXXXXXXXX(@Param("id") Long id, @Param("state") Long state);
在哪里
Table2Obj & Table3Obj分别是实体Table1和Table2、Table3的关系映射。
定义如下。
@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY)
private Set<Table2> table2Obj = new HashSet<>();
【讨论】:
【参考方案3】:@Query
注释的内容或多或少地通过调用EntityManager.createQuery(…)
传递给持久性提供程序。所以那里允许的任何东西都可以在@Query
中使用。 AFAIK、JPQL(到 JPA 2.0 时)仅支持 EXISTS
和 IN
子句的子查询。
【讨论】:
JPA 2.0 支持 WHERE 和 HAVING 子句中的子查询。在这些表达式中,它们可以用于多种类型的表达式,包括 EXISTS 和 IN。以上是关于Spring Data:查询注释中是不是可以有子查询?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Spring Data @Query 注释值中使用常量?
codeigniter 中是不是有子查询库?或者我如何在codeigniter 3中进行子查询?