2017-02-09 2 views
0

Мне нужно объединить 2 таблицы в один объект с некоторым условием. У меня есть следующие:Соедините две таблицы в одном объекте java от jpa

@Entity 
@Table(name = "polling") 
public class Polling extends DomainIdObject { 

    @ManyToOne 
    @JoinColumn(name = "owner_id") 
    private Person owner; 

    @Column(name = "poll_name") 
    private String name; 

    @Column(name = "description") 
    private String description; 

    @ManyToMany(targetEntity = PollingSchedule.class, mappedBy = "polling", fetch = FetchType.EAGER) 
    private List<PollingSchedule> variants; 

    @Column(name = "start_time") 
    private LocalDateTime startTime; 

    @Column(name = "end_time") 
    private LocalDateTime endTime; 

    //getters and setters 

@Entity 
@Table(name = "polling_schedule") 
public class PollingSchedule extends DomainIdObject { 

    @JoinColumn(name = "polling_id") 
    private Polling polling; 

    @Column(name = "poll_var") 
    private String pollingVariant; 

    //gettters and setters 

, но когда я выполнить следующий код:

Query query = getEntityManager().createNativeQuery("SELECT * FROM polling p WHERE p.id=1", Polling.class); 
List list = query.getResultList(); 
List<PollingSchedule> variants = ((Polling) list.get(0)).getVariants(); 

список вариантов пуст. Таблицы в БД выглядит следующим образом:

polling 
|id|owner_id|poll_name|description|start_time|end_time| 

polling_schedule 
|id|polling_id|poll_var| 

Таким образом, в результате я хочу, чтобы объект опроса содержит только те PollingVariants, которые имеют соответствующую polling_id в polling_schedule таблице.

Я попытался использовать аннотации Filter, SecondaryTable, но это не работает для меня (или я неправильно использовал его).

Я использую hibernate4 и пружинный загрузочный 1.5.1

Может кто-нибудь мне помочь?

+0

Вы можете использовать JPQL запрос вместо родного запроса чтобы избежать уродливого литья в третьей линии. – Deltharis

ответ

2

Я думаю, что отношение между Polling и PollingSchedule является «один ко многим» (не многие ко многим). И так как вам нужно двунаправленную связь между этими объектами, вы должны изменить их, как это:

Pooling.java

@Entity 
@Table(name = "polling") 
public class Polling extends DomainIdObject { 
    ... 
    @OneToMany(mappedBy="polling") 
    private List<PollingSchedule> variants; 
    ... 
} 

PoolingSchedule.java

@Entity 
@Table(name = "polling_schedule") 
public class PollingSchedule extends DomainIdObject { 

    @ManyToOne 
    @JoinColumn(name = "polling_id") 
    private Polling polling; 
    ... 
} 
+0

Да, это правильно. Когда я пытаюсь использовать '@ OneToMany', я не должен был использовать' @ ManyToOne'. спасибо – ZhenyaM

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