mysql - 执行 JPQL 查询时遇到问题
问题描述
我正在使用带有查询的 JPQL 使用 Spring Boot 实体管理器。以下查询工作正常:
SELECT h, uh FROM Hour h, UserHour uh
但现在我想获得一个使用查询的结果:
SELECT h FROM Hour h INNER JOIN UserHour uh WHERE uh.userId = 1
但是结果为零,这是意料之外的。
但是,当我使用 SQL 查询时:
SELECT * FROM hour
INNER JOIN user_hour
ON user_hour.hour_id = hour.hour_id
WHERE user_hour.user_id = '1'
我得到了我想要的结果。
请帮帮我。
编辑:
List<Object> result = entityManager.createQuery(
"select distinct hr " +
"from Hour hr " +
"join hr.users hu " +
"where hu.id = :userID")
.setParameter( "userID", 1)
.getResultList();
System.out.println(result);
用户实体:
package com.timely.backend.models;
import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Entity
@Table(name = "USER")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String fullname;
private String email;
private String creation_date;
// user roles
@ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
@CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
private Set<Role> roles;
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "user_hour",
joinColumns = @JoinColumn(name = "userId"),
inverseJoinColumns = @JoinColumn(name = "hourId")
)
private List<Hour> hours = new ArrayList<>();
public User() {
}
public User(String username, String password, String fullname, String email, String creation_date) {
this.username = username;
this.password = password;
this.fullname = fullname;
this.email = email;
this.roles = getRoles();
this.creation_date = creation_date;
}
//If user is admin
public boolean isAdmin() {
return roles.contains(Role.ADMIN);
}
//region Getters & Setters
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setFullname(String fullName) {
this.fullname = fullName;
}
public void setEmail(String email) { this.email = email; }
public void setRoles(Set<Role> roles) { this.roles = roles; }
public void setCreation_date(String creation_date) { this.creation_date = creation_date; }
public int getId() { return id; }
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getFullname() {
return fullname;
}
public String getEmail() { return email; }
public Set<Role> getRoles() { return roles; }
public String getCreation_date() { return creation_date; }
//endregion
}
UserHour 实体:
package com.timely.backend.models;
import javax.persistence.*;
@Entity
@Table(name = "user_hour")
public class UserHour {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getHourId() {
return hourId;
}
public void setHourId(int hourId) {
this.hourId = hourId;
}
public UserHour(int userId, int hourId) {
this.userId = userId;
this.hourId = hourId;
}
public UserHour(){
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private int userId;
private int hourId;
}
小时实体:
package com.timely.backend.models;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "HOUR")
public class Hour {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int hourId;
private String date;
private String startTime;
private String endTime;
public Hour(int hourId, String date, String startTime, String endTime) {
this.hourId = hourId;
this.date = date;
this.startTime = startTime;
this.endTime = endTime;
}
public Hour(){
}
@ManyToMany(mappedBy = "hours")
private List<User> users = new ArrayList<>();
public int gethourId() {
return hourId;
}
public void sethourId(int hourId) {
this.hourId = hourId;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
MySQL查询工作:
SELECT id, date, start_time, end_time FROM hour
JOIN user_hour
ON user_hour.hour_id = hour.hour_id
WHERE user_hour.user_id = '1'
用户表:
用户小时表:
小时表:
解决方案
推荐阅读
- c++ - 如何将元素添加到向量的字符串位置
- swift - 快速铸造
- google-sheets - 使用工作表日期过滤器查询和显示数据
- sql - groupby 和 join 中的最大计数
- android - 如何在没有重复的 recyclerview 中显示 Firebase 数据
- python - 模块“keras.backend”没有属性“tf”
- php - SMTP 错误:无法连接到服务器:无法建立连接,因为目标机器主动拒绝它
- python - Python:初始化二维数组的不同方法给出不同的输出
- php - PHP 读取 .txt 文件并创建一个数组
- python - 具有多个 n 数的时间序列数据预测