in persistence-commons/persistence-commons-jpa-base/src/main/java/org/kie/kogito/persistence/postgresql/PostgresQuery.java [109:163]
public List<T> execute() {
//Get type information from filters/sorting to cast JSON document fields in query
fields = addFilters(new HashMap<>(), filters);
if (sortBy != null && !sortBy.isEmpty()) {
sortBy.stream().filter(sortBy -> !fields.containsKey(sortBy.getAttribute()))
.forEach(sortBy -> fields.put(sortBy.getAttribute(),
new JsonField(sortBy.getAttribute())));
}
// Build the query to retrieve the filtered data from the temporary table above.
StringBuilder queryString = new StringBuilder("SELECT * FROM kogito_data_cache")
.append(" WHERE cache_name = '")
.append(name)
.append("'");
if (filters != null && !filters.isEmpty()) {
queryString.append(" AND ");
queryString.append(filters.stream()
.map(filter -> new StringBuilder()
.append(filterStringFunction(filter)))
.collect(joining(AND)));
}
// Sorting
if (sortBy != null && !sortBy.isEmpty()) {
queryString.append(" ORDER BY ");
queryString.append(sortBy.stream().map(f -> {
final JsonField field = fields.get(f.getAttribute());
return cast(field, format(ATTRIBUTE_ACCESSOR, f.getAttribute())).append(" ").append(f.getSort().name());
}).collect(joining(", ")));
}
LOGGER.debug("Executing PostgreSQL query: {}", queryString);
jakarta.persistence.Query query = repository.getEntityManager().createNativeQuery(queryString.toString());
query.unwrap(org.hibernate.query.NativeQuery.class).addScalar("json_value", new CustomType<>(new JsonBinaryType(), new TypeConfiguration()));
if (limit != null) {
query.setMaxResults(limit);
}
if (offset != null) {
query.setFirstResult(offset);
}
List<?> results = query.getResultList();
return results.stream().map(r -> {
if (r == null) {
return null;
}
try {
return objectMapper.readValue(objectMapper.writeValueAsString(r), type);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
}