我有以下问题:
类Set<C> s
有C
个对象。 C
定义如下:
class C {
A a;
B b;
...
}
鉴于A e
,B f
,...,我想从s
找到所有对象o
,以便o.a = e
,o.b = f
,....
最简单的解决方案:流过s
,过滤,收集,返回。但这需要很长时间。
半定解决方案:创建Map<A, Set<C>> indexA
,将a
的值拆分为indexA.get(e)
。流过{{1}},过滤其他条件,收集,返回。
更多解决方案:为所有字段创建索引映射,从地图中选择所有条件,在最短列表上流式传输,过滤其他条件,收集,返回。
你知道这是怎么回事:我们不小心建立了一个数据库。问题是我不想序列化我的对象。当然我可以抓住H2或HSQLDB并将我的对象粘在那里,但我不想坚持它们。我基本上只想在常规的旧堆上Java对象上使用索引。
肯定有一些我可以重用的东西。
答案 0 :(得分:0)
最终,我发现了一些解决此问题的项目,包括CQEngine,这似乎是用于此目的的最完整和最成熟的库。
答案 1 :(得分:0)
HSQLDB提供了将Java对象直接存储在内存数据库中而无需对其进行序列化的选项。
属性sql.live_object=true
用作mem:
数据库的连接URL上的属性,例如jdbc:hsqldb:mem:test;sql.live_object=true
。使用OTHER类型的列创建表以存储对象。此表中的额外列复制对象中需要建立索引的任何字段。
例如:
CREATE TABLE OBJECTLIST (ID INTEGER IDENTITY, OBJ OTHER, TS_FIELD TIMESTAMP, INT_FIELD INTEGER)
CREATE INDEX IDX1 ON OBJECTLIST(TS_FIELD)
CREATE INDEX IDX2 ON OBJECTLIST(INT_FIELD)
对象存储在OBJ列中,索引字段的时间戳和整数值存储在额外列中。诸如SELECT * FROM OBJECTLIST WHERE INT_FILED = 1234
之类的SQL查询返回包含相关对象的行。
http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_sql_conformance