如何通过子对象的唯一值或值集访问 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 对象存储在单个区域中,因此对于我们的用例来说,并置或类似的概念是不可接受的(尽管它会使这变得无限简单)
需要
- 通过唯一的电子邮件地址访问客户(全球唯一且在插入前经过验证)
- 通过外部系统标识符名称和 ID 的唯一组合访问客户(同样是全局唯一的,并且在插入之前经过验证)
如果需要,我们确实可以访问 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
我的查询有什么问题?
我有一种情况,我在 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 对象存储在单个区域中,因此对于我们的用例来说,并置或类似的概念是不可接受的(尽管它会使这变得无限简单)
需要
- 通过唯一的电子邮件地址访问客户(全球唯一且在插入前经过验证)
- 通过外部系统标识符名称和 ID 的唯一组合访问客户(同样是全局唯一的,并且在插入之前经过验证)
如果需要,我们确实可以访问 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
我的查询有什么问题?