繁体   English   中英

加入JPA查询-spring开机

[英]Join in JPA query - spring boot

两张桌子

预订和地点

需要使用连接来连接两个带有 locationid(外键)的表

本机查询

SELECT l.location_name, 
b.bookingid, 
b.email, 
b.vehicle_type, 
b.vehicle_no 
FROM locations l RIGHT JOIN bookings b 
ON b.locationid = l.locationid;

预订表实体

@Entity
public class Bookings {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer bookingid;
    private String email;
    private String vehicle_type;
    private String  vehicle_no;
    private String date;
    private String time;
    private Integer duration;
    private String cost = "0";
    private Integer locationid;
    private String slotid;
    private Integer paid = 0;
} 

位置表实体

@Entity
public class Locations {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer locationid;
    private String location_name;
    private Integer slots = 0;
    private String area;    
}

预计 Output

+---------------+-----------+------------------+---------------+--------------+
| location_name | bookingid |      email       |  vehicle_no   | vehicle_type |
+--------------}-+-----------+------------------+---------------+--------------+
| Pothys        |        22 | test05@gmail.com | TN-01-AA-123  | Four Wheeler |
| Brook Fields  |        25 | test05@gmail.com | TN-01-AA-1111 | Two Wheeler  |
+---------------+-----------+------------------+---------------+--------------+

如何在 spring 中实现,有人帮帮我......谢谢。

首先,您必须定义实体中的关系,如下所示:

在 Bookings 中定义多对一关系

@Entity
public class Bookings {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer bookingid;
    private String email;
    private String vehicle_type;
    private String  vehicle_no;
    private String date;
    private String time;
    private Integer duration;
    private String cost = "0";

    // change this
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="locationid")
    private Locations location;

    private String slotid;
    private Integer paid = 0;
} 

定义位置中的双向关系

@Entity
public class Locations {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer locationid;
    private String location_name;
    private Integer slots = 0;
    private String area;    

    // add this
    // you can use Set instead of List
    @OneToMany(mappedBy="location",fetch=FetchType.LAZY)
    private List<Bookings> bookings;
}

一旦实体被建模,我们继续进行查询,我不知道你使用什么实现,在这个例子中我将使用 Criteria API 来做:

由于我们无法实现右连接,我们将替换将返回相同结果的内连接。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<YourPojo> cq = cb.createQuery(YourPojo.class);

Root<Locations> rootLocations = cq.from(Location.class);
Join<Locations,Bookings> joinBookings = rootLocations.join(Locations_.bookings,JoinType.INNER);
// If you don't use metamodel change Locations_.bookings for rootLocations.get("bookings")

cq.multiselect(
    rootLocations.get(Locations_.location_name),
    joinBookings.get(Bookings_.bookingid),
    joinBookings.get(Bookings_.email),
    joinBookings.get(Bookings_.vehicle_type),
    joinBookings.get(Bookings_.vehicle_no)
);
//If you don't use metamodel change it as in join

List<YourPojo> results = entityManager.createQuery(cq).getResultList();

您将需要一口井来获取数据,它具有与标准多选具有相同参数的构造函数,具有相同的顺序和相同的类型

public YourPojo(String location_name,Integer bookingid,String email, String vehicle_type, String vehicle_no){
    [...]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM