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对象。可能是什么问题?
是的。不同将删除重复项。但房间对象仍然返回所有LapBooking。 –
好吧,我不知道你想完成什么,我很抱歉,我不得不告诉你,它不会按照你想要的方式工作。在这种情况下,hibernate会以与它在数据库中表示的方式完全一样的方式返回Lab对象。这是必要的,因为状态可能会写回数据库。应该可以使用Lab和负责任的LabBooking对象返回地图。但是我只需要LabBook对象而不是Lab对象。之后创建地图只是一个简单的lambda表达式。如果你需要帮助,只需要问。 –