Как выбрать данные при весенней загрузке, используя jpa, в зависимости от состояния столбца jsonb postgres (без собственного запроса)? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть база данных Postgres с полем jsonb.Я использовал список предикатов, где условие с построителем критериев в jpa.Теперь я хочу получить данные JSON, хранящиеся в базе данных, на основе нескольких причин, а также JSON.Как это можно было сделать?

Таблица базы данных

private List<Predicate> whereClause(CriteriaBuilder criteriaBuilder, Root<KafkaLog> kafkaLog,
  KafkaLogSearchDto search) {
List<Predicate> predicates = new ArrayList<>();
if (search.getTopic() != null && !search.getTopic().isEmpty()) {
  Expression<String> literal =
      criteriaBuilder.literal("%" + search.getTopic().toUpperCase() + "%");
  predicates.add(criteriaBuilder.like(criteriaBuilder.upper(kafkaLog.get("topic")), literal));
}
if (search.getOffset() != null) {
  predicates.add(criteriaBuilder.equal(kafkaLog.get("offset"), search.getOffset()));
}
if (search.getResourceId() != null) {
  predicates.add(criteriaBuilder.equal(kafkaLog.get("invoiceId"), search.getResourceId()));
}
if (search.getPartition() != null) {
  predicates.add(criteriaBuilder.equal(kafkaLog.get("partition"), search.getPartition()));
}
if (search.getStatus() != null) {
  predicates.add(criteriaBuilder.equal(kafkaLog.get("status"), search.getStatus()));
}
if (search.getCreatedAtFrom() != null && search.getCreatedAtTo() != null) {
  predicates.add(criteriaBuilder.and(
      criteriaBuilder.greaterThanOrEqualTo(kafkaLog.get("createdAt").as(Date.class),
          search.getCreatedAtFrom()),
      criteriaBuilder.lessThanOrEqualTo(kafkaLog.get("createdAt").as(Date.class),
          search.getCreatedAtTo())));
}
if (search.getPayload() != null && !search.getPayload().isEmpty()) {
  Expression<String> literal =
      criteriaBuilder.literal("%" + search.getPayload().toUpperCase() + "%"); 



}
return predicates;

}

private CriteriaQuery<KafkaLog> getKafkaBySearchCriteria(KafkaLogSearchDto search, String orderBy,
  int sortingDirection) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<KafkaLog> criteriaQuery = criteriaBuilder.createQuery(KafkaLog.class);
Root<KafkaLog> kafkaLog = criteriaQuery.from(KafkaLog.class);

List<Predicate> predicates = whereClause(criteriaBuilder, kafkaLog, search);
criteriaQuery.where(predicates.toArray(new Predicate[] {}));

if (orderBy == null || orderBy.isEmpty()) {
  orderBy = "topic";
}
Expression<?> orderColumn = kafkaLog.get(orderBy);
if (orderColumn != null) {
  if (sortingDirection == 0) {
    criteriaQuery.orderBy(criteriaBuilder.asc(orderColumn));
  } else if (sortingDirection == 1) {
    criteriaQuery.orderBy(criteriaBuilder.desc(orderColumn));
  }
}
return criteriaQuery;

}

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Это примерный предикат для поиска jsonb с предложением like:

Forexate.getExpressions (). Add (cb.and (cb.like (cb.function ("jsonb_extract_path_text", String.class, root.get ("tags"), cb.literal (this.key)), "%" + this.value + "%")));

0 голосов
/ 06 марта 2019

очевидно, поддержка пользовательских типов данных вплоть до уровня JDBC / базы данных не является частью самого JPA. Для простого чтения JSON вы могли бы сделать это с отображением сущности на String (если реализация JPA это позволяет).

Однако у вас есть несколько альтернатив:

  1. Если вам нужно придерживаться JPA, вы можете реализовать конвертер для обработки JSON для вас (универсальный, как в этой статье, или более конкретный - как вам нравится): Использование JPA с PostgreSQL JSON
  2. Если вы можете отказаться от JPA и сделать это непосредственно с JDBC / SQL, что дает вам полный потенциал PostgreSQL: как хранить jsonb PostgreSQL с помощью SpringBoot + JPA?

При чтении поля JSONB вы можете разрешить базе данных выполнять преобразование в строку (поскольку пока нет прямой поддержки JSON в JDBC) с использованием явного преобразования типа, например ::

SELECT payload::text FROM my_table WHERE ...

... или примените некоторую причудливую фильтрацию к самому полю JSON, или верните только часть данных JSON, также.

...