2010-05-28 12 views
5

Po prostu zaczynam radzić sobie z JPA w prostej aplikacji internetowej Java działającej na Glassfish 3 (Dostawca trwałości to EclipseLink). Do tej pory bardzo to lubię (błędy w interakcji netbeans/glassfish na boku), ale jest coś, co chcę robić, nie jestem pewien jak to zrobić.JPA - Ustawianie właściwości klasy obiektu z kolumny obliczeniowej?

Mam klasy encji (artykuł), które są mapowane do tabela bazy danych (artykuł). Próbuję wykonać kwerendę w bazie danych, która zwraca kolumnę obliczeniową, ale nie mogę dowiedzieć się, jak skonfigurować właściwość klasy Article, tak aby właściwość została wypełniona przez wartość kolumny podczas wywoływania kwerendy.

Jeśli wykonuję regularne zapytanie "wybierz identyfikator, tytuł, treść z artykułu", otrzymam listę obiektów z artykułami w porządku, z wypełnionymi identyfikatorami, tytułami i właściwościami bryły. To działa dobrze.

Jeśli jednak zrobić poniżej:

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); 

(jest to pełny wyszukiwania używając TSearch2 na PostgreSQL - to funkcja db-specyficzny, więc używam NativeQuery)

Ty widzę, że pobieram kolumnę obliczeniową, zwaną nagłówkiem. Jak dodać właściwość nagłówka do mojej klasy artykułu, aby została wypełniona przez to zapytanie?

Do tej pory próbowałem ustawić go jako @Transient, ale to kończy się na tym, że jest cały czas zerowy.

Odpowiedz

7

Istnieje prawdopodobnie ma dobrych sposobów, aby to zrobić, tylko ręcznie:

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; 
    ... 
} 
2

AFAIK, JPA nie oferuje standardową obsługę obliczonych atrybutów. W przypadku trybu hibernacji można użyć numeru Formula, ale EclipseLink nie ma bezpośredniego odpowiednika. James Sutherland wykonane pewne sugestie w Re: Virtual columns (@Formula of Hibernate) choć:

Nie ma bezpośredniego odpowiednika (proszę dziennika rozszerzeniem), ale w zależności od co chcesz zrobić, istnieją sposoby, aby osiągnąć to samo.

EclipseLink definiuje TransformationMapping które mogą mapowania obliczoną wartość z wielu pól wartości lub dostępu do bazy danych.

Można zastąpić SQL dla dowolnej operacji CRUD dla klasy przy użyciu deskryptora deskryptora deskryptora DescriptorQueryManager.

Możesz zdefiniować WIDOK na swojej bazie danych , która wykonuje funkcję i zamapować swój obiekt na widok zamiast tabeli.

Można również wykonywać pomniejsze tłumaczenia przy użyciu metod Konwertuj lub uzyskiwania/ustawiania właściwości.

Również spojrzeć na enhancement request że ma rozwiązanie używając DescriptorEventListener w komentarzach.

Wszystko to jest niestandardowe WZP oczywiście.

Powiązane problemy