В моем приложении у меня есть таблица 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"]
},
]
I Надеюсь, теперь понятно, что у меня возникла проблема, особенно с тем, как сделать так, чтобы результат был доступен для страницы с помощью поля 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
Однако это плохо, потому что я ограничиваю строки, поэтому я не могу получить все факты некоторого customerId. Как решить такую проблему? Может, мне сделать два запроса?