2016-02-26 21 views
0

我有三个实体,春数据JPA连接两个或更多的entites

@Entity 
public class Deck { 

    @Id 
    private int id; 
    private int number; 
    private String name; 

    @OneToMany(mappedBy = "deck") 
    private Set<Lab> labs; 

    //getter and setter methods 

} 

@Entity 
public class Lab { 

    @Id 
    private int id; 
    private String name; 

    @ManyToOne 
    private Deck deck; 

    @OneToMany(mappedBy = "lab") 
    private Set<LabBooking> labBooking; 

    //getter and setter methods 

} 

@Entity 
public class LabBooking { 

    @Id 
    private int id; 

    private Date startTime; 
    private Date endTime; 

    @ManyToOne 
    private Lab lab; 

    //getter and setter methods 

} 

以下是LabRepository,

public interface LabRepository extends CrudRepository<Lab, Integer>{ 

    @Query("SELECT l FROM Lab l JOIN l.labBooking lb WHERE l.deck.id = :deckId AND lb.startTime > '2016-02-24 15:00:00'") 
    List<Lab> findLabs(@Param("deckId") int deckId); 

} 

我试图找回在其中占据了甲板实验室名单从特定的时间开始。

当我执行在MySQL等效查询(SELECT * FROM lab l JOIN lab_book lb ON l.id = lb.lab_id WHERE l.deck_id = 9999 AND lb.start_time > '2016-02-24 15:00:00'),我得到以下结果

id  name deck_id id end_time   start_time   lab_id 
9001 Lab One 9999 5 2016-02-24 17:00:00 2016-02-24 16:00:00 9001 

在我正在以下结果弹簧应用,

[{ 
    "lab_id": 9001, 
    "lab_name": "Lab One", 
    "lab_booking": [{ 
     "id": 4, 
     "start_time": "2016-02-24 15:00:00", 
     "end_time": "2016-02-24 16:00:00" 
    }, { 
     "id": 5, 
     "start_time": "2016-02-24 16:00:00", 
     "end_time": "2016-02-24 17:00:00" 
    }, { 
     "id": 3, 
     "start_time": "2016-02-24 14:00:00", 
     "end_time": "2016-02-23 14:30:00" 
    }] 
}] 

实验室对象应该只包含预订ID 5,而是显示所有的ID。

如果sql查询返回5条记录,那么存储库会返回5个重复的Lab对象。可能是什么问题?

回答

0

似乎你失踪的不同。

SELECT distinct l FROM Lab l JOIN l.labBooking lb WHERE l.deck.id = :deckId AND lb.startTime > '2016-02-24 15:00:00'" 
+0

是的。不同将删除重复项。但房间对象仍然返回所有LapBooking。 –

+0

好吧,我不知道你想完成什么,我很抱歉,我不得不告诉你,它不会按照你想要的方式工作。在这种情况下,hibernate会以与它在数据库中表示的方式完全一样的方式返回Lab对象。这是必要的,因为状态可能会写回数据库。应该可以使用Lab和负责任的LabBooking对象返回地图。但是我只需要LabBook对象而不是Lab对象。之后创建地图只是一个简单的lambda表达式。如果你需要帮助,只需要问。 –