簡體   English   中英

ResultSetJdbcGpsDevice和@SearchableComponent

[英]ResultSetJdbcGpsDevice & @SearchableComponent

我在使用org.compass.gps.device.jdbc.ResultSetJdbcGpsDevicemapping.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM