2015-04-03 5 views
0

У меня есть эта сущность:JPA, @Transient поле и отображение Native Query

@Entity 
@Table(name = "entry") 
@SqlResultSetMapping(
    name = "viewEntry", 
    entities = 
    @EntityResult(entityClass = ViewEntry.class, 
      fields = { 
        @FieldResult(name="id", column = "id"), 
        @FieldResult(name="guid", column = "guid"), 
        @FieldResult(name="link", column = "link"), 
        @FieldResult(name="descr", column = "descr"), 
        @FieldResult(name="pubDate", column = "pub_date"), 
        @FieldResult(name="read", column = "my_read") 
      } 
    ) 
) 
public class ViewEntry implements Serializable { 
    @Id 
    private Integer id; 
    private String guid; 
    private String link; 
    private String descr; 
    private Date pubDate; 
    @Transient 
    private Boolean read; 
} 

read Поле проживает в другой таблице, поэтому я сделал это преходяще, чтобы предотвратить ошибки отображения JPA. Для извлечения содержимого субъекта, я хочу использовать родной запрос, который выглядит следующим образом:

select id,guid,link,descr,pub_date,feed_id,user_id,is_read as my_read from entry join user_to_entry .... 
-- skipped dynamic part of query 

Проблема заключается в том, что я понятия не имею, как отобразить собственные запросы к моей сущности. В частности, я не знаю, будет ли поле @Transient игнорироваться EntityManager. Помоги пожалуйста.

+0

Может быть опечаткой, но вы в своем сопоставлении указываете столбец как 'my_read', но в запросе он называется' is_read'. –

+0

Насколько я понимаю, параметр 'column' - это имя псевдонима в наборе результатов, параметр' name' - это имя поля. Исправьте меня, если я ошибаюсь –

+0

Вы правы, это просто не было 'как my_read' в исходном сообщении. –

ответ

2

Чтобы отобразить результаты нативного запроса вы можете использовать SqlResultSetMapping http://docs.oracle.com/javaee/7/api/javax/persistence/SqlResultSetMapping.html

Без отображения, если столбцы в родном запросе совпадает с именем атрибута или, если они отображаются с @Column в Сущности, то вы не» t нужно отображение.

+1

Будет ли заполнено поле переходного процесса значением в случае такого отображения? Я попробовал это раньше и получил нули в поле 'read'. –

+0

Посмотрите на мой отредактированный вопрос, чтобы увидеть SqlResultSetMapping Я попытался использовать –

+1

Переходные поля @Transient и transient (ключевое слово Java) всегда будут игнорироваться JPA! –

2

Вы можете отобразить это поле в другой таблице, используя @SecondaryTable в вашей организации. Что-то вроде этого:

... 
@SecondaryTable(name="user_to_entry", 
     [email protected](name="entry_id")) 
public class ViewEntry implements Serializable { 
    @Id 
    private Integer id; 
    private String guid; 
    private String link; 
    private String descr; 
    @Column(name="pub_date") 
    private Date pubDate; 
    @Column(table = "user_to_entry") 
    private Boolean read; 
} 

Если вы не можете сделать это по какой-то причине, вы можете сопоставить собственные результаты SQL в сущность, как этот

em.createNativeQuery("<native SQL>", ViewEntry.class) 

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

Третий вариант заключается в использовании @SqlResultSetMapping, но я также не уверен, что это будет работать с переходными полями. Например, проверьте this.

+0

Я не могу использовать @SecondaryTable, потому что он принимает только ключи в качестве столбцов сопоставления. Я попробовал это. –

+0

Что я делаю сейчас: 'Query query = em.createNativeQuery (sql.toString()," viewEntry ");' где 'viewEntry' является именем @SqlResultSetMapping. –

+0

Работает ли он с переходными полями? –

Смежные вопросы