4

例如,我有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对象。也就是说,如果有 10 个对象具有正确的日期,则列表将只有这 10 个对象,仅此而已。是否可以?ServiceStatus.datedate1date2ServiceStatusserviceStatuses

提前致谢。

4

5 回答 5

8

您可以使用@Where子句:

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

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

于 2012-09-11T08:07:33.027 回答
1

我使用@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?

于 2012-09-11T09:23:25.487 回答
0

您可以在查询时使用 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

于 2012-09-11T08:10:29.213 回答
0

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

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

于 2012-09-11T08:11:07.527 回答
0
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();

知道了?

于 2012-09-11T10:52:41.040 回答