Это похоже на тривиальный вариант использования Hibernate или JPA, но я несколько дней пытался заставить его работать.
У меня есть position
класс сущностей, который имеет latitude
, longitude
и updateTime
поля (среди прочих).Я хотел бы посчитать количество различных комбинаций этих трех полей, игнорируя остальные.В SQL это тривиально:
SELECT COUNT(*) FROM (SELECT DISTINCT LONGITUDE, LATITUDE, UPDATE_TIME FROM POSITION) AS TEMP;
Важно, чтобы я абстрагировал реализацию моей базы данных от остальной части моего приложения, потому что разные пользователи могут захотеть использовать разные механизмы баз данных.(Черт, я использую h2 для тестирования и mariadb для локального производства ...)
Я пытался перевести этот SQL-код в Java-код, используя синтаксис Hibernate или JPA, но я не могу понять, как.
РЕДАКТИРОВАТЬ - Здесь так близко, как я смог получить с помощью JPA (ref: https://en.wikibooks.org/wiki/Java_Persistence/Criteria)
public long getCountDistinctInFlightPositions() {
Session session = sessionFactory.openSession();
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> innerQuery = criteriaBuilder.createTupleQuery();
Root<Position> position = innerQuery.from(Position.class);
innerQuery.multiselect(
position.get("longitude"),
position.get("latitude"),
position.get("updateTime")
);
// The method countDistinct(Expression<?>) in the type CriteriaBuilder is not applicable for the arguments (CriteriaQuery<Tuple>)
criteriaBuilder.countDistinct(innerQuery);
return 1;
}