gpt4 book ai didi

java - 使用泛型返回 RavenDB StreamResult

转载 作者:行者123 更新时间:2023-11-30 02:15:24 28 4
gpt4 key购买 nike

我正在努力保持代码紧凑,最重要的是,在处理 RavenDB 的 querydsl 类型(即我存储在数据库中的类型)时,坚持“不要重复自己”的原则。我有两种情况迫使我复制/粘贴方法或用 if 语句乱扔代码:

  • 我想将一个通用 querydsl 类型作为参数传递给该方法
  • 我想从方法返回通用 querydsl 类型

第一种情况:类似这样

public int RetrieveStuff(<myGenericType>)
{
QGenericType qgt= QGenericType.GenericType;
IRavenQueryable<GenericType> query = session.query(GenericType.class, "GenericType/ByName");
}

第二种情况:

public CloseableIterator<StreamResult<GenericType>> RetrieveMoreStuff(String id)
{
doSomething();
return Session.advanced().stream(query); //type depends on the operation
}

由于我无法编译上述方法,因此我被迫为每种类型创建一个单独的(但功能相同)方法!像这样:

private CloseableIterator<StreamResult<supertype>> retrieveStuff();
private CloseableIterator<StreamResult<subtype1>> retrieveStuff1();
private CloseableIterator<StreamResult<subtype2>> retrieveStuff2();

等等

我不清楚以下内容:

  • 这是一个与 Java 泛型相关的问题,还是 Querydsl 类型强烈“绑定(bind)”到它们在创建时指定的类型?换句话说,Querydsl 类型“映射”的类型是否与 Querydsl 类型密不可分?
  • 为什么我不能这样做: IRavenQueryable<supertype> query = session.query(subtype.class, "Something/ByName")
  • 是否有可能以这种方式对 querydsl 类型和 RavenDB 中存储的类型应用多态性?如果我在 RavenDB 中存储父类(super class)型及其子类型,我可以以某种方式在查询代码中使与集合的交互变得通用吗?

如果原则上可行,我将非常感谢有效的方法签名和内部最少的代码来使查询正常工作。

非常感谢您的帮助。

最佳答案

您可以使用:

IRavenQueryable<? extends Animal> query = session.query(Dog.class) 

但是,要对多态查询进行建模,您应该在索引中使用 WhereEntityIs :示例:https://github.com/ravendb/ravendb-jvm-client/blob/7845a881d917e1be56aa6913aa5aba85cedd7190/Raven.Client.Java/src/test/java/net/ravendb/client/connection/WhereEntityIsTest.java#L16

QueryDSL 的唯一目的是避免查询中的字符串(类型安全)。它可用于寻址简单属性以及嵌套属性。例子: https://github.com/ravendb/ravendb-jvm-client/blob/68ca05f0f3e158ec1702d64eca11d1e6b5dc8a17/Raven.Client.Java/src/test/java/net/ravendb/tests/querying/UsingDynamicQueryWithRemoteServerTest.java#L127

关于java - 使用泛型返回 RavenDB StreamResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48691110/

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