Как сделать запрос отношения многие ко многим в GreenDAO со свойством источника, отличным от первичного ключа?

Предположим, у нас есть следующие объекты: Item:

class Item {
...
    @Index(unique=true)
    private String guid;
...
    @ToMany
    @JoinEntity(entity = JoinItemsWithTags.class, sourceProperty = "itemGuid", targetProperty = "tagName")
    private List<Tag> tagsWithThisItem;
    ...
}

Тег:

class Tag {
    @Id
    private Long localId;
    @Index(unique = true)
    private String name;
    ...
}

и мы должны присоединиться к ним. Вот мой класс сущности соединения:

@Entity(nameInDb = "item_tag_relations")
class JoinItemsWithTags {
    @Id
    private Long id;
    private String itemGuid;
    private String tagName;
    ...
}

Я хочу использовать имя тега в качестве свойства соединения вместо длинного идентификатора, потому что проще поддерживать согласованность при синхронизации с сервером. Но в настоящее время теги getter в классе Item всегда возвращают пустой список. Я заглянул в журнал и нашел сгенерированный запрос, который использует внутри этого геттера:

SELECT * <<-- there were a long sequence of fields
FROM "tags" T  JOIN item_tag_relations J1 
ON T."_id"=J1."TAG_NAME" <<-- here is the problem, must be `T."NAME"=J1."TAG_NAME"` 
WHERE J1."ITEM_GUID"=?

Так что проблема в том, что объединение основано на тегах _id поле. Сформирован List<Tag> _queryItem_TagsWithThisItem(String itemGuid) Метод неявно использует этот идентификатор для объединения:

// this `join` nethod is overloaded and pass tag's id as source property
queryBuilder.join(JoinItemsWithTags.class, JoinItemsWithTagsDao.Properties.TagName)
                    .where(JoinItemsWithTagsDao.Properties.ItemGuid.eq(itemGuid));

Правильный подход в этом случае может быть следующим, я полагаю:

// source property is passed explicitly
queryBuilder.join(/* Desired first parameter -->> */ TagDao.Properties.Name,
    JoinItemsWithTags.class, JoinItemsWithTagsDao.Properties.TagName)
                    .where(JoinItemsWithTagsDao.Properties.ItemGuid.eq(itemGuid));

Но этот код находится в сгенерированном дао, и я не знаю, как с ним что-то сделать. Есть ли способ обойти это?

0 ответов

Другие вопросы по тегам