我正在努力保持我的代码紧凑,最重要的是,坚持不要重复自己"处理RavenDB的querydsl类型时的原则(即我存储在db中的类型)。 我有两种情况迫使我复制/粘贴方法或使用if语句乱丢代码:
第一种情况:类似这样的事情
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();
等
我不清楚以下内容:
IRavenQueryable<supertype> query = session.query(subtype.class, "Something/ByName")
? 如果原则,我非常感谢有效的方法签名和最少的代码来使查询正常工作。
非常感谢你的帮助。
答案 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