【发布时间】:2016-11-01 00:25:19
【问题描述】:
是否可以通过子选择获取集合并将其设置到实体中?我需要通过限制来查找实体,然后,我需要将它们加入另一个实体。
例如,我需要找到在给定日期在公司工作的员工的公司
从纯 SQL 我需要这样的东西:
select * from Company c
LEFT JOIN (
select * from Employee where hireDate > 10.5.2015 AND departureDate < 10.12.2015
) e
on c.id = e.companyId
我在 Spring 数据中通过这个查询尝试过,但它不起作用
@Query("SELECT c FROM Company c LEFT JOIN FETCH (c.employees e where e.hireDate > ?1 AND e.departureDate < ?1)) WHERE c.id = ?2)
List<Company> findCompanyWitEmployes(Long salary, Long companyId);
实体:
public class Employee{
Long id
String name;
Date hireDate;
Date departureDate;
@ManyToOne
@JoinColumn(name = "companyId", insertable = false, updatable = false)
Company company;
}
public class Company{
Long id
String name;
@OneToMany(mappedBy="company", cascade=CascadeType.REFRESH, fetch = FetchType.LAZY)
private Set<Employee> employees;
}
我收到此错误:
2016-06-29 11:50:35.824 [ServerService Thread Pool -- 134] ERROR o.h.hql.internal.ast.ErrorCounter - line 1:81: expecting IDENT, found '('
2016-06-29 11:50:35.824 [ServerService Thread Pool -- 134] ERROR o.h.hql.internal.ast.ErrorCounter - line 1:81: expecting IDENT, found '('
antlr.MismatchedTokenException: expecting IDENT, found '('
at antlr.Parser.match(Parser.java:211) ~[antlr-2.7.7.jar:na]
【问题讨论】:
-
Spring Data 与它无关。建议你在网上搜索JPQL。你不能“加入”子查询,只能沿着关系......以“LEFT JOIN FETCH c.employees e”开头,没有“where”子句。
-
嗨,谢谢你的解释..所以我只有一种方法可以做到这一点,当我设置惰性获取时,我可以在下一步中得到结果,当我只获得给定标准的员工并设置它们时进入公司收集
-
我不明白你的意思。我用 LEFT JOIN FETCH 语法说 START。如果你想添加额外的条件,你可以在 JOIN ... 上指定一个 ON 子句,就像任何 JPA 2.1 参考文档所说的那样
标签: hibernate jpa spring-data spring-data-jpa jpql