В моем приложении у меня есть таблица customer_facts
, представленная объектом гибернации:
@Entity
data class PersistedCustomerFacts(
@Id
val id: Long,
val customerId: String
val factValue: String
)
Он хранит все факты о клиентах. У каждого клиента может быть несколько фактов. Я хочу запросить таблицу и получить результат, состоящий из списка каждого идентификатора клиента с его фактами. Но я также хочу, чтобы он был доступен для просмотра по идентификатору клиента, поэтому, например, я могу получить только первых двух клиентов. Я хотел бы показать пример. Скажем, я хочу получить первые два результата, упорядоченные по идентификатору клиента.
Данные в базе:
id, customerId, factValue
1, 'customerA', 'likes cats'
2, 'customerA', 'likes dogs'
3, 'customerA', 'doesnt likes rats'
4, 'customerB', 'likes cats'
5, 'customerB', 'likes rats'
6, 'customerB', 'likes bikes'
7, 'customerB', 'doesnt likes cats'
8, 'customerC', 'doesnt likes bikes'
окончательный результат будет
[
{
"customerId": "customerA",
"facts": ["likes cats", "likes dogs", "doesnt likes rats"]
},
{
"customerId": "customerB",
"facts": ["likes cats", "likes rats", "likes bats"]
},
]
Я надеюсь, что теперь ясно, что у меня есть проблема, особенно с тем, как сделать результат доступным для страниц по полю customerId. Я пробовал что-то вроде этого:
val criteriaBuilder = entityManager.criteriaBuilder
val criteriaQuery = criteriaBuilder.createQuery(PersistedCustomerFacts::class.java)
val customerFacts = criteriaQuery.from(PersistedCustomerFacts::class.java)
criteriaQuery
.select(customerFacts)
.orderBy(criteriaBuilder.asc(customerFacts.get("customerId")));
val typedQuery = entityManager.createQuery(criteriaQuery)
typedQuery.firstResult = 0
typedQuery.maxResults = 2
return typedQuery.resultList
Однако это плохо, потому что я ограничиваю строки, поэтому я могу не получить все факты некоторого идентификатора клиента. Как решить такую проблему? Может быть, я должен сделать два запроса?