【问题标题】:JPQL Left join with filtering on one-to-many collectionJPQL 左连接,过滤一对多集合
【发布时间】:2015-05-23 10:55:26
【问题描述】:

我有两个实体,用户和活动处于一对多关系中,其中用户有许多活动。我的目标是根据条件检索所有具有活动子集的用户。例如,我想检索所有处于“待定”状态的用户和相关活动。用户可能没有任何待处理的活动。在这种情况下,我希望用户没有活动。

我怎样才能为此编写 JPQL。

提前感谢您的帮助

【问题讨论】:

  • 很好,到目前为止你尝试了什么?
  • ** select u from User u left join u.activity a where a.state = 'Pending' **。但这不是我想要的方式
  • 请用一些数据库信息更新您的问题

标签: jakarta-ee jpa entity hql jpql


【解决方案1】:

在 JPA 2.1 中引入了 JOIN ON,但我不确定它是否可以与 FETCH 结合使用。 基本上我建议尝试以下查询:

SELECT u from User u LEFT JOIN FETCH u.activity a ON a.state = 'Pending'

如果您没有 JPA 2.1 或上述解决方案不起作用,那么您将不得不获取用户并随后加载他们的活动(在单个查询中)或加载用户的所有活动并过滤它们,正如 Sarz 在他/她的回答中所写。

【讨论】:

    【解决方案2】:

    你可以像在你的实体中那样做这个集合关联:

    //bi-directional many-to-one association to Activities
        @ManyToOne(fetch=FetchType.LAZY)
        @JoinColumn(name="Activity_Id")
        private Activity Activity;
    
        public Activity getActivity(){
            this.Activity
        }
    

    当您的查询时:

    List<User> toReturn= new ArrayList<>();
        Query query = em.createQuery("select u from User u ");
        List<User> list = query.getResultList();
        for(User u : list){
            if(u.getActivity().getStatus().equal("PENDING")){
                toReturn.add(u);
                //Some of your business Logic
            }
            //Some of your business Logic
        }
    

    希望有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 2020-05-10
      • 2012-09-12
      • 2013-12-28
      • 2016-03-08
      • 2015-03-04
      • 1970-01-01
      • 2015-07-18
      • 2010-10-15
      相关资源
      最近更新 更多