涉及Joda Intervals的JPA查询

时间:2013-02-22 14:15:10

标签: mysql jpa find criteria

所以我使用Play Framework(1.2.5)开发应用程序。但是我在检索一些特定数据方面遇到了一些麻烦。

我有两个类:Event和Site。事件发生在一段时间内(定义为Joda Interval)并包含多个站点。每个站点都有一个位置(用lat和lng定义)。我想要做的是获取在特定时间段内(可能在地图边界内)参与事件的站点列表。

我将如何进行此查询?我尝试过使用JPA的CriteriaBuilder,甚至自己写出查询,但我还没有解决如何处理时间段的问题。

活动模型

@Entity
@Table(name = "event")
public class Event extends GenericModel {
    @Id
    @GeneratedValue
    public Long id;
    @Columns(columns = {
        @Column(name = "start"),
        @Column(name = "end")})
    @Type(type = "org.joda.time.contrib.hibernate.PersistentInterval")
    public Interval eventPeriod;
    public String title;
    @ManyToMany
    public List<Site> sites = new ArrayList<Site>();
}

网站模型

@Entity
@Table(name = "site")
public class Site extends Model {
    @Column(name = "akey", unique = true, nullable = false)
    public String key;
    public Double latitude;
    public Double longitude;
}

用于在DB中创建表的SQL

CREATE  TABLE event (
    id BIGINT(20) NOT NULL AUTO_INCREMENT ,
    start DATETIME NOT NULL ,
    end DATETIME NOT NULL ,
    title VARCHAR(255) NOT NULL ,
    PRIMARY KEY (id)
);

CREATE  TABLE site (
    id BIGINT(20) NOT NULL AUTO_INCREMENT ,
    akey VARCHAR(255) NOT NULL ,
    latitude DOUBLE NOT NULL ,
    longitude DOUBLE NOT NULL ,
    PRIMARY KEY (id) ,
);

CREATE  TABLE event_site (
    event_id BIGINT(20) NOT NULL,
    sites_id BIGINT(20) NOT NULL,
    KEY FKevent_id (event_id),
    KEY FKsites_id (sites_id)
);

谢谢!

1 个答案:

答案 0 :(得分:0)

持久间隔添加两个属性; 'start'和'end'到您在查询期间可以访问的变量。作为一个例子,你需要

from Event
where :targetDate between eventPeriod.start and evenPeriod.end

他们在java doc中提到但我发现我必须阅读代码以找出如何使用它们。 http://joda-time.sourceforge.net/contrib/hibernate/apidocs/org/joda/time/contrib/hibernate/PersistentInterval.html