У меня есть база данных Hibernate с одной таблицей, которая выглядит следующим образом:
PURCHASE_ID | PRODUCT_NAME | PURCHASE_DATE | PURCHASER_NAME | PRODUCT_CATEGORY
------------------------------------------------------------------------------
1 Notebook 09-07-2018 Bob Supplies
2 Notebook 09-06-2018 Bob Supplies
3 Pencil 09-06-2018 Bob Supplies
4 Tape 09-10-2018 Bob Supplies
5 Pencil 09-09-2018 Steve Supplies
6 Pencil 09-06-2018 Steve Supplies
7 Pencil 09-08-2018 Allen Supplies
И я хочу вернуть только самые новые покупки, основываясь на некоторых других ограничениях.Например:
List<Purchase> getNewestPurchasesFor(Array<String> productNames, Array<String> purchaserNames) { ... }
Можно вызвать с помощью:
List<Purchase> purchases = getNewestPurchasesFor(["Notebook", "Pencil"], ["Bob", "Steve"]);
На английском языке: «Дайте мне самые последние покупки, для ноутбука или карандаша, Бобом или Стивом».
И предоставит:
PURCHASE_ID | PRODUCT_NAME | PURCHASE_DATE | PURCHASER_NAME
-----------------------------------------------------------
1 Notebook 09-07-2018 Bob
3 Pencil 09-06-2018 Bob
5 Pencil 09-09-2018 Steve
Таким образом, это похоже на «отдельный» поиск по нескольким столбцам или «лимит» на основе некоторых постсортированных комбинированныхуникальный ключ столбца, но все примеры, которые я нашел, показывают, что с SELECT DISTINCT(PRODUCT_NAME, PURCHASER_NAME)
по получают только эти столбцы, тогда как мне нужно использовать формат:
from Purchases as entity where ...
Так что типы моделей возвращаются с неповрежденными отношениями.
В настоящее время мой запрос возвращает также все старые покупки:
PURCHASE_ID | PRODUCT_NAME | PURCHASE_DATE | PURCHASER_NAME | PRODUCT_CATEGORY
------------------------------------------------------------------------------
1 Notebook 09-07-2018 Bob Supplies
2 Notebook 09-06-2018 Bob Supplies
3 Pencil 09-06-2018 Bob Supplies
5 Pencil 09-09-2018 Steve Supplies
6 Pencil 09-06-2018 Steve Supplies
Какие, для повторных покупок вызывает значительное снижение производительности.
Есть ли какие-либо специальные ключевые слова, которые я должен использовать для достижения этой цели?Языки запросов и SQL-фу не мои сильные стороны.
Редактировать:
Обратите внимание, что в настоящее время я использую Criteria
API и хотел бы продолжитьпри этом.
Criteria criteria = session.createCriteria(Purchase.class);
criteria.addOrder(Order.desc("purchaseDate"));
// Product names
Criterion purchaseNameCriterion = Restrictions.or(productNames.stream().map(name -> Restrictions.eq("productName", name)).toArray(Criterion[]::new));
// Purchaser
Criterion purchaserCriterion = Restrictions.or(purchaserNames.stream().map(name -> Restrictions.eq("purchaser", name)).toArray(Criterion[]::new));
// Bundle the two together
criteria.add(Restrictions.and(purchaseNameCriterion, purchaserCriterion));
criteria.list(); // Gives the above results
Если я пытаюсь использовать отдельную проекцию, я получаю ошибку:
ProjectionList projections = Projections.projectionList();
projections.add(Projections.property("productName"));
projections.add(Projections.property("purchaser"));
criteria.setProjection(Projections.distinct(projections));
В результате:
17:08:39 ERROR Order by expression "THIS_.PURCHASE_DATE" must be in the result list in this case; SQL statement:
Потому что, какупомянутое выше, добавление набора проекций / отдельных столбцов, по-видимому, указывает Hibernate на то, что я хочу эти столбцы в качестве результата / возвращаемого значения, когда я хочу просто ограничить возвращаемые объекты модели на основе уникальных значений столбцов.