【问题标题】:Spring Data JPA joining two or more entitesSpring Data JPA 连接两个或多个实体
【发布时间】:2016-02-26 10:31:51
【问题描述】:

我有三个实体,

@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 &gt; '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

在 spring 应用程序中,我得到以下结果,

[{
    "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"
    }]
}]

Lab 对象应该只包含预订 id 5,而不是显示所有 id。

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

【问题讨论】:

    标签: mysql spring-data spring-data-jpa


    【解决方案1】:

    似乎你缺少的独特之处。

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

    【讨论】:

    • 是的。 distinct 将删除重复项。但是 Room 对象仍然返回所有的 LapBooking。
    • 好的,我不明白你想要完成什么,很抱歉我不得不告诉你它不能按照你想要的方式工作。在这种情况下,hibernate 会以与数据库中表示的方式完全相同的方式返回 Lab 对象。这是必要的,因为状态可能会被写回数据库。应该可以返回带有 Lab 和负责 LabBooking 对象的地图。但我只会请求 LabBook 对象而不是 Lab 对象。之后创建地图只是一个简单的 lambda 表达式。如果您需要帮助,请询问。
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2018-11-30
    • 2019-06-15
    • 2016-10-10
    • 2021-12-15
    相关资源
    最近更新 更多