首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过子对象(唯一值或值集)访问Gemfire对象

如何通过子对象(唯一值或值集)访问Gemfire对象
EN

Stack Overflow用户
提问于 2015-02-12 21:48:30
回答 2查看 1.1K关注 0票数 0

我有一个查询,它看起来像这样,不像预期的那样工作。我尝试了很多不同的变体,但是我忽略了这个查询的一些内容。

库代码

代码语言:javascript
复制
@Query("SELECT c FROM /customer c, c.emailAddresses email WHERE email.emailAddress = $1")
List<CustomerEntity> findByEmailAddress(String emailAddress);       

模型

代码语言:javascript
复制
public class CustomerEntity {
   @Id
   protected String id;
   private List<CustomerEmailAddressEntity> emailAddresses;      
}

public class CustomerEmailAddressEntity {
   private Long id;
   private String emailAddress;
 }

我得到的堆栈看起来如下:

代码语言:javascript
复制
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)

我不知道我做错了什么。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 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中,发生了以下异常.

代码语言:javascript
复制
org.springframework.dao.InvalidDataAccessApiUsageException: Result object returned from GemfireCallback isn't a SelectResult: [UNDEFINED]
...

但是,在使用GemFire 8.1.0运行时,OQL语句(查询)仍按预期工作,即使在我的应用程序域对象上未初始化嵌套集合时.

代码语言:javascript
复制
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);

}

然后..。

代码语言:javascript
复制
customerRepo.findCustomersInCity("Portland");

我(重新)对我的客户进行了编码,以便只有在添加地址的情况下才初始化“address”集合,并且我在测试用例中使用了有地址和没有地址的客户组合。

因此,即使GemFire 8.x可能会处理这个问题,我仍然认为正确初始化对象是明智的。

票数 1
EN

Stack Overflow用户

发布于 2015-02-12 23:16:39

我们小组的一位谦逊的建筑师找到了原因。这不是一个糟糕的查询,而是一个数据问题。有些客户的电子邮件地址为空,Gemfire OQL无法处理空集合元素。如果GemfireOQL给我一个更有用的错误信息,那就更好了。

因此,吸取的经验教训:

在将集合存储到gemfire 7之前,先对它们进行简化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28488447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档