Поиск списка объектов по идентификатору первичного ключа — Apache Cayenne

Это как-то связано с моим предыдущим вопросом, где я обсуждал поиск строк по идентификаторам внешнего ключа. Этот вопрос направлен на поиск списка объектов по идентификатору первичного ключа.

В приведенном ниже коде я пытаюсь найти список объектов Person, указав список идентификаторов. Но Apache Cayenne не может этого сделать, потому что ID_PK_COLUMN — это строка, а не Property.

ObjectSelect
    .query(Person::class.java)
    .where(Person.ID_PK_COLUMN.in(listOfIds)) // <- Cannot perform this
    .select(context)

Как найти список объектов Person по ID?

Я знаю, что у нас есть Cayenne.objectForPK, но он находит только один объект.

Использование Apache Cayenne 4.1.


person gurpreet-    schedule 30.11.2018    source источник
comment
Что вы получаете, просто: val expression = Person.ID_PK_COLUMN.in(listOfIds) ?   -  person Andre Artus    schedule 01.12.2018
comment
@AndreArtus: Ну, Person.ID_PK_COLUMN возвращает String, поэтому метод .in() с ним не работает, поэтому я написал, что не могу выполнить .in() для этого конкретного выражения. Я думаю, что @andrus решил мой ответ.   -  person gurpreet-    schedule 01.12.2018


Ответы (1)


Поскольку идентификаторы обычно не отображаются как свойства объекта в Cayenne, а «ID_PK_COLUMN» является свойством «db:», вам необходимо создать выражение «db» для аргумента метода «where». Для этого есть API:

ExpressionFactory.inDbExp(Person.ID_PK_COLUMN, listOfIds)

(Кстати, Property — это просто синтаксический сахар поверх ExpressionFactory)

person andrus_a    schedule 01.12.2018
comment
Спасибо за ваш ответ, это работает. Apache Cayenne настолько мощный и быстрый, я бы хотел, чтобы о нем узнало больше людей. - person gurpreet-; 01.12.2018