Свести коллекцию как часть HQL-запроса? - PullRequest
1 голос
/ 08 декабря 2011

У меня есть требование использовать удобный для отчетов запрос из HQL.То есть каждый столбец представлен стандартным типом Java (Long, Integer, String, List), а не сопоставленным классом.Значения будут использоваться сторонней библиотекой, поэтому у меня очень ограниченный контроль над постобработкой.

Мой пример дерева объектов выглядит следующим образом:

a.x
a.y (a collection of z)
a.y.z[0].v
a.y.z[1].v
a.y.z[2].v

Я бы хотел запроситьполучить два столбца.Первый столбец - это простое поле «топор», а второй - строка списка всех значений ayzv, разделенных запятыми.Если это невозможно, то удовлетворительное возвращение второго столбца в виде списка значений ayzv в Java.

Короче говоря, я бы хотел свести коллекцию ayzv в строку csv илиобъект List изнутри запроса.

Я уже пытался сделать следующее:

  • Использование ключевого слова "new" в подвыборке списка.то есть, "выбрать топор, (выбрать новый список (ayzv)) из".При необходимости я мог бы преобразовать содержимое списка в csv, но это вызвало синтаксическую ошибку.

  • Использование ключевого слова "new" с пользовательским объектом в подвыборке.то есть, «выбрать топор, (выбрать новый custom.package.ListToCsvObject (ayz)) из a».Это вызвало ту же ошибку, что и первая попытка

  • Использование ключевого слова elements () в select.К сожалению, кажется, что это ключевое слово работает только внутри предложений "in", "exist" (и т. Д.), А не как фактическое возвращаемое значение.

Единственное решение, которое нам удалось найтидолжен был создать хранимую процедуру в базе данных и использовать ее, но такое решение мучительно медленное через HQL (оно превращает запрос в секунду за 30-секундный запрос) и поэтому мы не хотим продолжать это делать.

Я * могу внести некоторые ограниченные изменения в отображение Hibernate (поэтому я могу добавить @formula и т. Д.), Но я бы предпочел не вносить существенных изменений в схему базы данных для ее поддержки,(Так что нет, я не хочу создавать денормализованный столбец «csv_value» в базе данных!)

Может ли кто-нибудь предложить какой-нибудь код или, в случае неудачи, альтернативный подход к решению этой проблемы?

1 Ответ

1 голос
/ 08 декабря 2011

Попробуйте что-то вроде этого должно работать.Уплощение списка в строку через запятую выполняется в конструкторе вашего класса VO.Вы также можете взглянуть на resultTransformer , вы можете создать пользовательский resultTransformer и прикрепить его к запросу.

class ResultVO {

String x;
String y;
  public ResultVO(String x,List<Z> y) {
     this.x = x;
     this.y = createCSV(y);
  }
}

then in HQL
select new ResultVO(a.x,a.y) from a

Предупреждение - это не очень хороший способ использования JPA.Если большинство ваших вариантов использования таковы, вам следует серьезно пересмотреть, используя какой-то другой подход постоянства (ibastis, шаблон Spring jdbc + sql и т. Д.).

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