您好我有一个使用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的版本:
有什么想法吗?
更新:我一直在测试不同的查询,最后我得出的结论是,不可能在实体的不同属性上混合使用不等式和等式运算符。 我的测试是:
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);
答案 0 :(得分:2)
如果您为计划日期执行&gt;?1,则无论如何都不应该抓取空值,因此您不需要我想到的两个。
另一种方法是只做一个“status ='CREATED'”,然后按日期排序,确保你跳过你不想要的记录(当然不是最佳的)。
通常,应用引擎数据存储区应该支持不同属性上的不等式和相等性......它不允许在多个属性上使用多个不等式过滤器,如here所述。你能复制你收到的例外吗?