通过JPA在一个Java对象中联接两个表

Zhe*_*yaM 3 java spring hibernate jpa

我需要在一定条件下将2个表连接到一个对象中。我有以下几点:

@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
Run Code Online (Sandbox Code Playgroud)

但是当我执行以下代码时:

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();
Run Code Online (Sandbox Code Playgroud)

变体列表为空。DB中的表如下所示:

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

polling_schedule
|id|polling_id|poll_var|
Run Code Online (Sandbox Code Playgroud)

因此,结果是我希望轮询对象仅包含那些在polling_schedule表中具有对应的polling_id的PollingVariants。

我尝试使用Filter,SecondaryTable批注,但是它对我不起作用(或者我不正确地使用它)。

我使用hibernate4和spring boot 1.5.1

有人可以帮我吗?

小智 6

我认为之间的关系Polling,并PollingSchedule是一个一对多的(不是很多对多)。并且由于您需要在这些对象之间建立双向关系,因此应像这样更改它们:

Pooling.java

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

PoolingSchedule.java

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

    @ManyToOne
    @JoinColumn(name = "polling_id")
    private Polling polling;
    ...
}
Run Code Online (Sandbox Code Playgroud)