如何通过子对象的唯一值或值集访问 Gemfire 对象?

How to access a Gemfire object access by a sub-objects unique value or set of values?

我有一种情况,我在 Gemfire 中存储一个复杂的对象。为简单起见,它是一个具有多个属性的客户对象。我们还存储电子邮件地址对象列表(不仅仅是电子邮件字符串)、地址、phone 数字和对 "foreign systems" 的引用我需要确定查询数据的最佳方式。

首先是对象结构(为简单起见伪xsd)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstName" type="xs:string"/>
      <xs:element name="lastName" type="xs:string"/>
      ...
      <xs:element name="emailAddresses" type="emailAddressType" minOccurs="1"/> <!-- one or more -->
      <xs:element name="foreignSystemIdentifiers" type="foreignSystemIdentifierType"/> <!-- zero or more -->
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="emailAddressType">
    <xs:complexType>
        <xs:element name="emailAddress" type="xs:string"/>
        <xs:element name="addressType" type="xs:string"/>
        ...
    </xs:complexType>
</xs:element>
<xs:element name="foreignSystemIdentifierType">
    <xs:complexType>
        <xs:element name="foreignSystemName" type="xs:string"/>
        <xs:element name="foreignSystemId" type="xs:string"/>
        ...
    </xs:complexType>
</xs:element>
</xs:schema>

出于各种原因,我们将此数据作为 Customer 对象存储在单个区域中,因此对于我们的用例来说,并置或类似的概念是不可接受的(尽管它会使这变得无限简单)

需要

如果需要,我们确实可以访问 Elasticsearch,但我们真的很想通过直接返回客户对象来解决这两个独特的 get 请求。在 Gemfire 中解决此问题的最佳方法是什么? FWIW,我们也在使用 Spring-Data-Gemfire。

最简单的情况是使用查询 (GemFire OQL) 来获取您需要的内容...

SELECT c FROM /Customers c, c.emailAddresses e WHERE e.emailAddress = 

免责声明:我没有测试查询,但我认为这应该有效。

此外,sense 邮箱地址经过验证并保证唯一,您可以在此字段上添加索引以加快搜索速度。

然后使用 Spring Data GemFire 添加 Spring Data Repository 方法非常简单,例如...

public interface CustomersRepository extends GemfireRepository<Customer, Long> {

  ...

  @Query("SELECT c FROM /Customers c, c.emailAddresses e WHERE e.emailAddress = ")
  Customer findByEmailAddress(String emailAddrdess);

}

然后从你的服务方法...

@Service
public class CustomerService {
  ...
  public Customer lookupBy(String emailAddress) {
    ...
    return customerRepo.findByEmailAddress(emailAddress);
  }
}

希望这对您有所帮助(并回答您的问题)。

    @Query("SELECT c FROM /region c, c.emailAddresses email WHERE email.emailAddress = ")
    List<CustomerEntity> findByEmailAddress(String emailAddress);

这部分因堆栈跟踪而爆炸:

原因:java.lang.ClassCastException:com.gemstone.gemfire.cache.query.internal.Undefined 无法转换为 com.gemstone.gemfire.cache.query.SelectResults

我的查询有什么问题?