我有一个查询,它看起来像这样,不像预期的那样工作。我尝试了很多不同的变体,但是我忽略了这个查询的一些内容。
库代码
@Query("SELECT c FROM /customer c, c.emailAddresses email WHERE email.emailAddress = $1")
List<CustomerEntity> findByEmailAddress(String emailAddress); 模型
public class CustomerEntity {
@Id
protected String id;
private List<CustomerEmailAddressEntity> emailAddresses;
}
public class CustomerEmailAddressEntity {
private Long id;
private String emailAddress;
}我得到的堆栈看起来如下:
Caused by: java.lang.ClassCastException: com.gemstone.gemfire.cache.query.internal.Undefined cannot be cast to com.gemstone.gemfire.cache.query.SelectResults
at com.gemstone.gemfire.internal.cache.PRQueryProcessor.executeSequentially(PRQueryProcessor.java:330)
at com.gemstone.gemfire.internal.cache.PRQueryProcessor.executeQuery(PRQueryProcessor.java:127)
at com.gemstone.gemfire.internal.cache.PartitionedRegionQueryEvaluator.executeQueryOnLocalNode(PartitionedRegionQueryEvaluator.java:1370)
at com.gemstone.gemfire.internal.cache.PartitionedRegionQueryEvaluator.executeQueryOnRemoteAndLocalNodes(PartitionedRegionQueryEvaluator.java:339)
at com.gemstone.gemfire.internal.cache.PartitionedRegionQueryEvaluator.queryBuckets(PartitionedRegionQueryEvaluator.java:442)
at com.gemstone.gemfire.internal.cache.PartitionedRegion.doExecuteQuery(PartitionedRegion.java:1909)
at com.gemstone.gemfire.internal.cache.PartitionedRegion.executeQuery(PartitionedRegion.java:1829)
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:234)
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:195)
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.processQueryUsingParams(BaseCommand.java:1402)
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.processQuery(BaseCommand.java:1347)
at com.gemstone.gemfire.internal.cache.tier.sockets.command.Query.cmdExecute(Query.java:88)
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:174)
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:809)
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:940)
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1189)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at com.gemstone.gemfire.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:532)
at java.lang.Thread.run(Thread.java:724)我不知道我做错了什么。任何帮助都是非常感谢的。
发布于 2015-02-17 22:15:53
抓得好!
我要补充的是,一般来说,数组和基于集合的(应用程序域对象)属性永远不应该是空的。空空如也,但绝不为空。对于迭代来说,这可能是个问题(特别是对于导致NPEs相当模糊(类似于自动装箱/反装箱中的空原语类型包装器对象)和您已经看到的GemFire OQL。
不过,我会同意,如果GemFire能够识别出查询问题的原因或能够处理空引用,那么它将提供更多的信息和帮助。
有趣的是,这个问题可能是GemFire 7.0.2特有的。我刚刚使用GemFire 7.0.2和(最新的) GemFire 8.1.0测试了这个场景。
在7.0.2中,发生了以下异常.
org.springframework.dao.InvalidDataAccessApiUsageException: Result object returned from GemfireCallback isn't a SelectResult: [UNDEFINED]
...但是,在使用GemFire 8.1.0运行时,OQL语句(查询)仍按预期工作,即使在我的应用程序域对象上未初始化嵌套集合时.
class Customer ... {
Set<Address> addresses;
...
}
interface CustomerRepository implements GemfireRepository<Customer, Long> {
@Query("<trace> SELECT DISTINCT c FROM /Customers c, c.addresses a WHERE a.city = $1")
List<User> findCustomersInCity(String city);
}然后..。
customerRepo.findCustomersInCity("Portland");我(重新)对我的客户进行了编码,以便只有在添加地址的情况下才初始化“address”集合,并且我在测试用例中使用了有地址和没有地址的客户组合。
因此,即使GemFire 8.x可能会处理这个问题,我仍然认为正确初始化对象是明智的。
发布于 2015-02-12 23:16:39
我们小组的一位谦逊的建筑师找到了原因。这不是一个糟糕的查询,而是一个数据问题。有些客户的电子邮件地址为空,Gemfire OQL无法处理空集合元素。如果GemfireOQL给我一个更有用的错误信息,那就更好了。
因此,吸取的经验教训:
在将集合存储到gemfire 7之前,先对它们进行简化。
https://stackoverflow.com/questions/28488447
复制相似问题