Как преобразовать данные postgresql ARRAY_AGG в набор Java - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь получить данные ARRAY_AGG () в собственном запросе SQL:

ARRAY_AGG(table.foo) as foos

(В запросе есть GROUP BY, поэтому для получения результатов в виде значения столбца одного типа массива должен быть ARRAY_AGG.)

И его нужно преобразовать в набор Java:

Set<Long> foos;

в моем классе POJO.

Не обязательно использовать ARRAY_AGG, если есть другой способ.

Прямо сейчас я получаю исключение, когда звоню:

this.entityManager.createNativeQuery(sql).getResultList();
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458)

Есть ли способ избежать этого исключения и преобразовать данные?

1 Ответ

0 голосов
/ 04 июля 2018

Ну, так как вы застряли со старой версией, то возможное решение будет использовать пользовательский анализатор и эти аннотации.

@Transient
private Set<String> aggs;

@Column(name = "the_agg_column")
private String raw;

@PostLoad
protected void readAgg() {
Set<String> s = new TreeSet<>();
StringBuilder sb = new StringBuilder();
boolean isquoted = false;
final int len = raw.length();
for (int i = 0; i < len; i++) {

    char c = raw.charAt(i);
    if (c == '"') {
        if (sb.length() == 0) isquoted = true;
        else if (isquoted) isquoted = false;
        continue;
    }
    if (c == ',' || c == '}') {
          // do finish-up
          s.add(sb.toString());
          sb.setLength(0);
          continue;
    }
    if (isquoted && c == '\\') {
        c = raw.charAt(++i);
    }
    sb.append(c);
}

Это в основном говорит Hibernate, что вы хотите получить его в формате String, поэтому вам нужно проанализировать формат строки массива Postgres.

Обработка escape-символов может, вероятно, быть в некоторых особых случаях, но я держу пари, что вы используете Enum, поэтому я выбрал Set (или лучше EnumSet).

Если вы ожидаете, что вам, возможно, понадобится экранировать символы, отличные от " или \, это поможет вам https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-BACKSLASH-TABLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...