0

我在使用org.compass.gps.device.jdbc.ResultSetJdbcGpsDeviceand设置 @SearchableComponent 对象时遇到问题mapping.TableToResourceMapping

为了测试这一点,我设置了两个映射到对象的表(忽略 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然后我检索映射到该列为 0 的行的 B 的实例,但我也检索 A 的每个实例——因为它们的所有 B 组件都是默认实例。

我应该如何正确设置它?我觉得我可能在 Compass 文档中遗漏了一些东西。

4

1 回答 1

0

在试图弄清楚这一点后,我制定了以下解决方案:

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,包括一个也具有正确数据的实例 B。

于 2017-02-10T19:35:44.547 回答