Spring Data + Datanucleus + JPA按日期查询

时间:2014-08-12 23:21:36

标签: spring google-app-engine google-cloud-datastore spring-data datanucleus

您好我有一个使用Spring + Spring Data + Datanucleus(JPA)在GAE上运行的应用程序,我需要按日期和枚举查询实体。 我有一些测试用例和本地工作正常,也在我的本地运行开发服务器我得到了预期的结果。当我在GAE中部署相同的应用程序时,特定查询会抛出异常。

查询如下所示。

@Query("select campaign from Campaign campaign where campaign.scheduleDate is not null and campaign.scheduleDate > ?1 and campaign.status in ('CREATED')")
List<Campaign> scheduledPendingToStart(final Date fromDate);

我也尝试过:

@Query("select campaign from Campaign campaign where campaign.scheduleDate is not null and campaign.scheduleDate > ?1 and campaign.status in (?2)")
List<Campaign> scheduledPendingToStart(final Date fromDate, final Collection<CampaignStatus> status);

我修改了查询以查看是否可以找到问题,并且似乎比较了日期和不等式运算符&#34;&gt;&#34;是有问题的。 如果我使用相等运算符&#34; =&#34;查询运行正常但当然我没有得到预期的结果。

Campaign实体定义如下:

@Entity
public class Campaign extends BaseEntity implements Serializable {

@Basic
private String name;

@Column(nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Date scheduleDate;

@Enumerated(EnumType.STRING)
private CampaignStatus status;
...
...
}

我用于Spring,Datanucleus和AppEngine的版本:

  • spring.version&gt; 3.2.2.RELEASE
  • spring.data.jpa.version&gt; 1.3.5.RELEASE
  • datanucleus.version&gt; 3.1.4
  • appengine.sdk.version&gt; 1.7.5
  • appengine.datanucleus.version&gt; 2.1.2

有什么想法吗?

更新:我一直在测试不同的查询,最后我得出的结论是,不可能在实体的不同属性上混合使用不等式和等式运算符。 我的测试是:

WORKS

@Query("select campaign from Campaign campaign where campaign.scheduleDate is not null and campaign.scheduleDate > ?1")
List<Campaign> scheduledPendingToStart(final Date fromDate);

WORKS

@Query("select campaign from Campaign campaign where campaign.status in ('CREATED')")
List<Campaign> scheduledPendingToStart();

WORKS

@Query("select campaign from Campaign campaign where campaign.status = 'CREATED'")
List<Campaign> scheduledPendingToStart();

DOESN&#39; WORK

@Query("select campaign from Campaign campaign where campaign.scheduleDate is not null and campaign.scheduleDate > ?1 and campaign.status in ('CREATED')")
List<Campaign> scheduledPendingToStart(final Date fromDate);

DOESN&#39; WORK

@Query("select campaign from Campaign campaign where campaign.scheduleDate is not null and campaign.scheduleDate > ?1 and campaign.status = 'CREATED'")
List<Campaign> scheduledPendingToStart(final Date fromDate);

1 个答案:

答案 0 :(得分:2)

如果您为计划日期执行&gt;?1,则无论如何都不应该抓取空值,因此您不需要我想到的两个。

另一种方法是只做一个“status ='CREATED'”,然后按日期排序,确保你跳过你不想要的记录(当然不是最佳的)。

通常,应用引擎数据存储区应该支持不同属性上的不等式和相等性......它不允许在多个属性上使用多个不等式过滤器,如here所述。你能复制你收到的例外吗?