Как вы можете указать операторы причины предложения с помощью JPA Criteria Builder

Мне нужно указать оператор причины предложения AS OF SYSTEM TIME follower_read_timestamp() из CockroachDB для моего запроса с помощью Criteria Builder. Мне нужно использовать Criteria Builder, так как мои запросы создаются динамически и имеют множество различных необязательных предикатов, основанных на пользовательском вводе. Мне нужно указать оператор причины предложения, потому что у меня возникают некоторые проблемы с транзакциями, и мне посоветовали добавить его в службу поддержки. Я также просто хочу знать, как/если добавить такие пункты, так как мне приходилось делать это и в других случаях.

Вот документы о причине предложения AS OF SYSTEM TIME CockroachDB. https://www.cockreachlabs.com/docs/v22.2/as-of-system-time

Вот пример того, как выглядит мой код Criteria Builder — на самом деле он намного сложнее, но я упростил его для этого вопроса.

// Get criteria builder
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

// Create criteria query and root
CriteriaQuery<StorageEntity> criteriaQuery = criteriaBuilder.createQuery(StorageEntity.class);
Root<StorageEntity> root = criteriaQuery.from(StorageEntity.class);

List<Predicate> predicates = new ArrayList<>();

if (CollectionUtils.isNotEmpty(ids)) {
  predicates.add(criteriaBuilder.<List<UUID>> in(root.get("id")).value(ids));
}

/**
A lot of other dynamic predicates are added here which is why I'm using criteria builder
*/

if (CollectionUtils.isNotEmpty(otherIds)) {
  predicates.add(criteriaBuilder.<List<UUID>> in(root.get("otherIds")).value(otherIds));
}

// Get criteria query with filter predicates
criteriaQuery = criteriaQuery.where(predicates.toArray(new Predicate[] {}));

// Create query
TypedQuery<StorageEntity> query = entityManager.createQuery(criteriaQuery);

/**
Ideally here I would be able to add `AS OF SYSTEM TIME <timestamp>` clause cause statement
*/

// Execute query and get results
List<StorageEntity> storageEntities = query.getResultList();

p.s. Я использую jakarta.persistence:jakarta.persistence-api:2.2.3 в качестве транзитивной зависимости от org.springframework.boot:spring-boot-starter-data-jpa:2.7.7

JPA не имеет функции запроса исторических данных. Возврат управляемых объектов на основе определенного времени и необходимость отслеживать, как сохранить изменения ... просто не было сделано, о чем я знаю. Любая поддержка данных истории будет зависеть от поставщика JPA, или вы можете выполнить собственный SQL-запрос.

Chris 25.01.2023 22:27

Вы пытались сообщить JPA, что имя вашей таблицы - «actualname AS OF SYSTEM TIME Follower_read_timestamp()»?

histocrat 26.01.2023 21:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не проверял это (пришел сюда из тега cockroachdb), но, судя по документам, JPA не цитирует автоматически идентификаторы, содержащие пробелы. Учитывая, что, поскольку предложение идет в конце предложения FROM в таблице, вы, вероятно, могли бы просто использовать класс, аннотированный с помощью

Table(name = "actual_table_name AS OF SYSTEM TIME follower_read_timestamp()")

Вместо обычной аннотации имени таблицы всякий раз, когда вы хотите использовать предложение. Поскольку AS OF SYSTEM TIME работает только в запросах верхнего уровня, это должно генерировать действительный SQL, если это последнее имя таблицы, указанное в предложении FROM.

Если это не работает в вашем фактическом запросе, вы можете застрять в построении запроса, извлечении необработанного SQL, добавлении предложения с помощью манипуляций со строками, а затем в исходном выполнении.

вот хороший ресурс о том, как вы могли бы сделать то, что предложил @histocrat: antoniogoncalves.org/2012/05/24/…

RCX 26.01.2023 23:09

Другие вопросы по теме