【问题标题】:How to get collection by left join that is fetched by sub select via Spring data(JPQL)?如何通过 Spring 数据(JPQL)通过子选择获取的左连接获取集合?
【发布时间】: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


【解决方案1】:

据我所知,您忘记在右括号前加上“。这就是您收到该错误的原因。

@Query("SELECT c FROM Company c LEFT JOIN FETCH (c.employees e where e.hireDate > ?1 AND e.departureDate

【讨论】:

  • 不,他收到了这个错误,因为您无法加入 JPQL 中的子查询
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 2013-06-20
  • 2016-03-18
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多