使用泛型返回RavenDB StreamResult

时间:2018-02-08 17:11:10

标签: java generics polymorphism ravendb querydsl

我正在努力保持我的代码紧凑,最重要的是,坚持不要重复自己"处理RavenDB的querydsl类型时的原则(即我存储在db中的类型)。 我有两种情况迫使我复制/粘贴方法或使用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类型&#34; bind&#34;创建时给出的类型?换句话说,是Querydsl类型所映射的类型&#34;映射&#34;与Querydsl类型密不可分?
  • 为什么我不能这样做: IRavenQueryable<supertype> query = session.query(subtype.class, "Something/ByName")
  • 是否有可能在所有以这种方式将多态应用于querydsl类型和存储在RavenDB中的类型?如果我在RavenDB中存储超类型及其子类型,我可以在查询代码中以某种方式与集合进行交互吗?

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

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用:

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