【问题标题】:Hibernate: limit query with one-to-manyHibernate:使用一对多限制查询
【发布时间】:2012-09-11 08:01:27
【问题描述】:

例如,我有Service 实体:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "service")
public List<ServiceStatus> getServiceStatuses() {
    return serviceStatuses;
}

ServiceStatus 实体:

@ManyToOne
@JoinColumn(name = "service", nullable = false)
public Service getService() {
    return service;
}

@Column(name = "date", nullable = false)
@Temporal(TemporalType.DATE)
public Date getDate() {
    return date;
}

现在我需要查询所有Service 对象,以便每个对象都只包含ServiceStatus.date 介于date1date2 之间的ServiceStatus 对象。也就是说,如果有 10 个具有正确日期的 ServiceStatus 对象,则 serviceStatuses 列表将只有这 10 个对象,仅此而已。有可能吗?

提前致谢。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    你可以使用@Where子句:

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "service")
    @Where(clause = "is_deleted = 'N'")
    List<ServiceStatus> serviceStatuses = new ArrayList<ServiceStatus>();
    

    上述实现允许您过滤is_deleted = N 的记录。同样,您可以编写自己的实现。

    【讨论】:

    • 是的,这在子句是静态的情况下有效,但我可以使用这样的参数:“date >= :date1 and date
    • where 注释的作用是为空还是不为空?
    【解决方案2】:

    我使用@Filter 解决了这个问题:

    @FilterDef(name = "dateFilter", parameters = {
            @ParamDef(name = "date1", type = "date"),
            @ParamDef(name = "date2", type = "date") })
    @Filter(name = "dateFilter", condition = "date >= :date1 and date <= :date2")
    

    并将其应用于会话:

    session.enableFilter("dateFilter")
                    .setParameter("date1", date1)
                    .setParameter("date2", date2);
    

    顺便说一句,在使用 Hibernate 时,我应该使用什么进行查询:它是自己的机制还是在这种情况下像“内部联接”这样的“原始”SQL?

    【讨论】:

      【解决方案3】:

      您可以在查询时使用 Restrictions.le("date2",date2) 和 Restrictions.gt("date1",date1)。 看这个链接。

      http://www.mkyong.com/hibernate/hibernate-criteria-examples/

      以下也很有用

      http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

      【讨论】:

      • 好的,我正在添加代码作为另一个答案,以便正确缩进。
      【解决方案4】:

      您可以使用 HQL 为这种情况创建查询。

      http://www.mkyong.com/hibernate/hibernate-query-examples-hql/

      【讨论】:

        【解决方案5】:
        Criteria criteria = session.createCriteria(Service.class);
        if(date1!=null){
            criteria.add(Expression.ge("serviceStatuses.date1",date1));
        }
        if(date2!=null){
            criteria.add(Expression.le("serviceStatuses.date2",date2));
        }
        return criteria.list();
        

        知道了吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-16
          • 2021-02-03
          • 2023-04-07
          • 2010-09-20
          • 2019-01-23
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多