[英]ResultSetJdbcGpsDevice & @SearchableComponent
我在使用org.compass.gps.device.jdbc.ResultSetJdbcGpsDevice
和mapping.TableToResourceMapping
设置@SearchableComponent对象时遇到问题。
为了测试这一点,我设置了两个映射到对象的表(忽略id的东西,除非这实际上是导致此问题的原因):
a
id (pk) | name | create_time | update_time
------------------------------------------
b
id (pk|fk) | property1 | property2 | property3
----------------------------------------------
A和B的定义如下:
@Searchable(root=true)
public class A {
@SearchableId
private int id;
@SearchableProperty
private String name;
@SearchableProperty
private long create_time;
@SearchableProperty
private long update_time;
@SearchableComponent
private B b;
// getters, setters
}
@Searchable(root=false)
public class B {
@SearchableId
private int id;
@SearchableProperty
private String property1;
@SearchableProperty
private long property2;
@SearchableProperty
private String property3;
// getters, setters
}
这是我进行所有设置的方式:
conf = new CompassConfiguration()
.setSetting(CompassEnvironment.CONNECTION, "target/index")
.addClass(A.class)
.addClass(B.class);
compass = conf.buildCompass();
ResultSetJdbcGpsDevice jdbc = new ResultSetJdbcGpsDevice();
jdbc.setDataSource(ds);
jdbc.setName("sql-device");
jdbc.setMirrorDataChanges(true);
TableToResourceMapping mappingA = new TabbleToResourceMapping("a", "A");
mapping.addIdMapping(new IdColumnToPropertyMapping("id", "id"));
mapping.addDataMapping(new DataColumnToPropertyMapping("name", "name"));
mapping.addDataMapping(new DataColumnToPropertyMapping("create_time", "create_time"));
mapping.addDataMapping(new DataColumnToPropertyMapping("update_time", "update_time"));
TableToResourceMapping mappingB = new TabbleToResourceMapping("b", "B");
mapping.addIdMapping(new IdColumnToPropertyMapping("id", "id"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property1", "property1"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property2", "property2"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property3", "property3"));
jdbc.addMapping(mappingA);
jdbc.addMapping(mappingB);
gps = new SingleCompassGps(compass);
gps.addGpsDevice(jdbc);
gps.start();
gps.index();
这样,我从Compass收到以下错误:
java.lang.IllegalStateException: {sql-device}: No resource mapping defined in gps mirror compass for alias [B]. Did you defined a jdbc mapping builder?
at org.compass.gps.device.jdbc.ResultSetJdbcGpsDevice.doStart(ResultSetJdbcGpsDevice.java:127)
at org.compass.gps.device.AbstractGpsDevice.start(AbstractGpsDevice.java:124
at org.compass.gps.impl.AbstractCompassGps.start(AbstractCompassGps.java:166)
...
如果将B设置为root=true
则可以正常工作,并且我可以在字段A和B中搜索文本并找回东西。 但是,当A由搜索构建并返回时,其B实例为空。
如果我搜索property2:0
则检索B的实例,该实例映射到该列为0的行,但是我也检索A的每个实例-因为它们的所有B组件都是默认实例。
我应该如何正确设置呢? 我觉得我可能在指南针文档中缺少某些内容。
在试图弄清楚这一点之后,我制定了以下解决方案:
TableToResourceMapping mapping = new TabbleToResourceMapping("a", "A");
mapping.setQuery("select * from a join b using (id)");
mapping.addIdMapping(new IdColumnToPropertyMapping("id", "id"));
mapping.addDataMapping(new DataColumnToPropertyMapping("name", "name"));
mapping.addDataMapping(new DataColumnToPropertyMapping("create_time", "create_time"));
mapping.addDataMapping(new DataColumnToPropertyMapping("update_time", "update_time"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property1", "property1"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property2", "property2"));
mapping.addDataMapping(new DataColumnToPropertyMapping("property3", "property3"));
jdbc.addMapping(mapping);
这可能不是正确的方法,但是可以。 搜索为我提供了实例A,该实例A在其字段中具有正确的数据,包括实例B也具有正确的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.