Мне нужно указать оператор причины предложения 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, что имя вашей таблицы - «actualname AS OF SYSTEM TIME Follower_read_timestamp()»?
Я не проверял это (пришел сюда из тега 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/…
JPA не имеет функции запроса исторических данных. Возврат управляемых объектов на основе определенного времени и необходимость отслеживать, как сохранить изменения ... просто не было сделано, о чем я знаю. Любая поддержка данных истории будет зависеть от поставщика JPA, или вы можете выполнить собственный SQL-запрос.