JPA - Установка свойства класса объекта от вычисляемого столбца?

Я просто справляюсь с JPA в простом веб-приложении Java, работающем на Glassfish 3 (Поставщиком решения для хранения данных является EclipseLink). До сих пор мне действительно нравится он (ошибки в netbeans/glassfish взаимодействии в стороне), но существует вещь, что я хочу смочь сделать это, я не уверен, как сделать.

У меня есть класс объекта (Статья), это отображается на таблице базы данных (статья). Я пытаюсь сделать запрос на базе данных, которая возвращает вычисляемый столбец, но я не могу выяснить, как настроить свойство класса Статьи так, чтобы свойство было заполнено значением столбца, когда я называю запрос.

Если я делаю обычный "избранный идентификатор, заголовок, тело от статьи" запрос, я получаю список прекрасных объектов Статьи, с идентификатором, заголовком и заполненными свойствами тела. Это хорошо работает.

Однако, если я делаю ниже:

Query q = em.createNativeQuery("select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc",Article.class);

(это - полнотекстовый поиск с помощью tsearch2 на Пост-ГРЭС - это - определенная для дб функция, таким образом, я использую NativeQuery),

Вы видите, что я выбираю вычисляемый столбец, названный заголовком. Как я добавляю свойство заголовка к своему классу Статьи так, чтобы он был заполнен этим запросом?

До сих пор я попытался установить его, чтобы быть @Transient, но это только заканчивается с ним являющийся пустым все время.

5
задан growse 28 May 2010 в 09:20
поделиться

2 ответа

Вероятно, нет хороших способов сделать это, только вручную:

Object[] r = (Object[]) em.createNativeQuery(
    "select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc","ArticleWithHeadline")
    .setParameter(...).getSingleResult();

Article a = (Article) r[0];
a.setHeadline((String) r[1]);

-

@Entity
@SqlResultSetMapping(
    name = "ArticleWithHeadline",
    entities = @EntityResult(entityClass = Article.class),
    columns = @ColumnResult(name = "HEADLINE"))
public class Article {
    @Transient
    private String headline;
    ...
}
8
ответ дан 13 December 2019 в 22:02
поделиться

AFAIK, JPA не предлагает стандартизированной поддержки вычисляемых атрибутов. В Hibernate можно использовать формулу , но у EclipseLink нет прямого эквивалента. Джеймс Сазерленд сделал несколько предложений в Re: Виртуальные столбцы (@Formula of Hibernate) , хотя:

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

EclipseLink определяет TransformationMapping, который может отображать вычисленное значение из нескольких полей значения или получить доступ к базе данных.

Вы можете переопределить SQL для любого CRUD операция для класса, использующая его DescriptorQueryManager дескриптора.

Вы можете определить ВИД на своем база данных, выполняющая функцию и сопоставьте свою сущность с представлением вместо таблицы.

Вы также можете исполнить минор переводы с помощью Конвертеров или методы получения / установки свойства.

Также ознакомьтесь с запросом на расширение , в котором есть решение с использованием DescriptorEventListener в комментариях.

Все это конечно нестандартная JPA.

2
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: