gpt4 book ai didi

java - 查询结果为空时如何使用NVL从GemFire获取数据

转载 作者:行者123 更新时间:2023-12-02 10:15:41 27 4
gpt4 key购买 nike

我在项目中使用Spring Data GemFire,并且在使用存储库从缓存中获取查询结果,如下所述:https://docs.spring.io/spring-gemfire/docs/1.3.3.RELEASE/reference/html/gemfire-repositories.html

以下是我的存储库界面:

@Repository
@Region("someRegion")
public interface SomeRegionRepository extends GemfireRepository<CustomObject, Object> {

//Below works when id exists in gemfire region.
//But when id does not exists it
//gives java.lang.IllegalStateException: Unsupported query
@Query("select a.num from /someRegion a where a.id = $1")
Integer getNumById(String id);

//Below returns CustomObject instance when id exists in gemfire region.
//But when id does not exists it returns null (Expected)
CustomObject findById(String id);

}


在OQL查询中找不到该键的数据时,有什么方法可以返回0或其他值?

或者,有什么方法可以获取 null值,以便在没有数据时可以在调用方代码中处理它?

在此处指定的OQL中有一个称为 NVL的东西(如果第一个表达式为空,它可以返回其他值/表达式): https://gemfire.docs.pivotal.io/97/geode/developing/query_select/the_select_statement.html。但是我无法获得有关如何使用它的正确语法。

请帮忙。谢谢。

最佳答案

首先,在我们开始之前,要准备一个保管物品...

我看到您在上面的GemFire文档参考中引用了Pivotal GemFire 9.7,但是随后参考了Spring Data GemFire(SDG)1.3.3.RELEASE参考文档。我当然希望您不要将SDG 1.3.3.RELEASE与Pivotal GemFire 9.7一起使用。基于Pivotal GemFire 7.0.1,SDG 1.3.3已经过时了,不再受支持。

我怀疑您没有使用SDG 1.3.x,因此您应该始终参考最新的文档,here,尤其是here。甚至Google Search也会显示最新文档。

另外,您可以参考Pivotal GemFire Version Compatibility Matrix的Spring数据以获取更多详细信息。无论如何...

因此,我写了test class以便更好地了解您的UC。

在测试中,我使用可查询的Person classage field/property建模。对于Person类型,我有一个PersonRepository,并且我编写了与上述示例非常相似的查询,以按usual以及null-safe的方式按年龄查询一个人。

问题是,对于存储库,您想要通过返回null0来防止结果缺失的愿望是模棱两可的。

对于1,如果您已返回多个结果(例如,在SELECT a.num FROM /SomeRegion a中;即没有谓词),并且未对结果进行排序,那么除非您也知道了哪个值是哪个键的null,否则您将无法知道返回结果集中的键。

当然,这里不是这种情况,您确实使用谓词(即... WHERE a.id = $1)按ID对查询进行了限定。但是,在这种情况下,在查看查询(即SELECT a.num FROM ...)时,不清楚给定ID(即键)是否没有结果,或者仅仅是num是null。你真的不知道

我的测试继续说明这一点。

我有2个人["Jon Doe", "Jane Doe"]here。乔恩有明确的年龄,而简没有。当然,两个人都存在于缓存中(即“人物”区域)。

当我查询乔恩并断言他的年龄时,我得到了expected result

或者,当我查询Jane并声明她的年龄时,我可以得到两个值之一,即null0作为expected here(当前为0,因为我正在使用null-safe query)。如果我将查询更改为usual query,那么Jane的age的返回值实际上将是null,我可以这样声明。

但是,当我们开始查询一个不存在的人时,GemFire的行为就很清楚了。没有结果。我说明了这两种不同的方式(除了使用存储库以外),直接使用GemFire的QueryService API,然后再次使用SDG的便捷GemfireTemplate class,它简单地包装了GemFire Query API(这也是存储库在引擎盖;实际上,存储库增加的价值是映射/转换功能)。

如您所见,对于example,我必须处理没有结果的情况。

就存储库而言,因为您使用了自定义查询,所以对于存储库基础结构而言,这部分内容(即查询的中间结果)不是null并不立即可见。

如果您有SELECT person.address.city.name FROM ...怎么办?

是人null,地址null还是城市null?应该如何统一处理?该人可能会退出,但地址可能是null,这可能会导致行为与人或城市为null的情况有所不同。

实际上,存储库抽象确实处理null返回值,如here所示。

那么,我们该何去何从?

我们有几种选择:


您可以执行existence check,首先...

返回personRepository.existsById(bobDoe.getName())
    ? personRepository.getAge(bobDoe.getName())
    :0;
您可以在DAO的存储库之外进行处理(也许对简单查询案例(而不是涉及使用@Query批注的复杂查询进行适应/修饰/修饰存储库和委派),应该谨慎使用)。

@资料库
类PersonDao {

@Autowired
private PersonRepository personRepository;

Person findById(String name) {
return this.personRepository.findById(name).orElse(null);
}

Integer getAge(String name) {
// Either use the approach in #1, or do https://github.com/jxblum/contacts-application/blob/master/tests-example/src/test/java/example/tests/spring/data/gemfire/NullValueReturningRepositoryQueryMethodIntegrationTests.java#L143-L151.
}

...


}

仍然
另一个选择是让我们在SD上提供额外的支持,类似...

@Nullable Integer getAge(String name);

也许...

Optional<Integer> getAge(String name);

这种方法仍然不能解决歧义性问题,需要更多的思考。
如果OQL处理Elvis运算符,就像(在我上面的更复杂的示例中)那样,那真是太好了……

SELECT person?.address?.city?.name FROM / People ...


无论如何,我希望这能给您一些想法。在继续之前,我将需要更多地思考上面的#3。

如果您还有其他问题/反馈/想法,请在评论中提供它们,或者随时提交 JIRA ticket

谢谢!

关于java - 查询结果为空时如何使用NVL从GemFire获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54703984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com