[英]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.