java - 映射hibernate SQLQuery native在java实体中返回一个空对象
问题描述
我的 oracle 数据库中有两个表
还有两个实体用户和命令
@Entity
@Table(name = "Users")
public class User {
private int idUser;
private String login;
private String password;
private List<Command> commands = new ArrayList<>();
public User() { }
public User( String login, String password ) {
super();
this.setLogin( login );
this.setPassword( password );
}
@Id
@Column(name = "USER_ID", unique = true, nullable = false, scale = 0)
public int getIdUser() {
return idUser;
}
@Column(name = "USER_LOGIN", nullable = false)
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
@Column(name = "USER_PASSWORD", nullable = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "utilisateur")
public List<Command> getCommands() {
return commands;
}
public String toString() {
return this.idUser + ": " + this.login + "/" + this.password
;
}
}
@Entity
@Table(name="Commands")
public class Command {
private int idCommand;
private User utilisateur;
private Date commandDate;
public Command() {}
public Command( User user, Date commandDate ) {
this.setUser( user );
this.setCommandDate( commandDate );
}
@Id
@Column(name = "CMD_Id", unique = true, nullable = false, scale = 0)
public int getIdCommand() {
return idCommand;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
public User getUtilisateur() {
return user;
}
public void setUtilisateur(User user) {
this.user = user;
}
@Column(name = "CMD_DATE")
@Temporal(TemporalType.TIMESTAMP)
public Date getCommandDate() {
return commandDate;
}
public void setCommandDate(Date commandDate) {
this.commandDate = commandDate;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append( "Commande de >> " ).append( this.user )
.append( " - " ).append( this.commandDate ).append( "\n" );
return builder.toString();
}
}
和我的服务 java 类
@Service
@Transactional
public class MyServiceImpl implements MyService {
private static final long serialVersionUID = 8393594103219622298L;
private static final String MY_ADVANCED_REQUEST
="select us.USER_ID, cd.CMD_DATE, us.USER_PASSWORD " +
"from Users us , Commands cd ON us.USER_ID = cd.USER_ID " +
"where us.USER_ID = cd.USER_ID " +
"AND us.USER_ID = 5";
public List<Object> findUsersCmd() {
String query1 = MY_ADVANCED_REQUEST;
SQLQuery queryObj = sessionFactory.getCurrentSession().createSQLQuery(query1);
List<Object> lstObj =queryObj.list();
return lstObj;
}
}
我在这一行得到一个空列表List lstObj =queryObj.list(); .
我使用请求 SQLQuery 本机而不是 jpa。
我想为我们获取 1 个对象。USER_ID = 5(即使我在表命令中没有 us.USER_ID = 5),为我们获取 3 个对象。USER_ID=1(因为命令表中有 3 行);us.USER_ID=6 的 1 个对象(因为 Commands 表中有 1 行)
我怎样才能解决我的问题,为我的 us.USER_ID = 5 返回价值?
解决方案
左外连接返回第一个表中的所有行,只返回第二个表中匹配的行。(虽然 user_id=5 不在命令表中,但可以检索)
private static final String MY_ADVANCED_REQUEST
="select us.USER_ID, cd.CMD_DATE, us.USER_PASSWORD " +
"from Users us LEFT JOIN Commands cd ON us.USER_ID = cd.USER_ID ";
推荐阅读
- power-automate - Power Automate - 到共享点列表的 Postgrey 流在星期四不起作用
- android - 奇怪的 Shell 页面和 ListView 导航问题 [Xamarin Forms]
- python - 当我有多个参数时,为什么 Optuna CSV 文件每个参数只显示 1 个项目?
- r - geom_col over year and groups:有什么方法可以避免在酒吧分界?
- java - 允许通知 Android webview
- python - 尝试确定代码中是否存在 S3 路径
- python - Python HTTP Server - TypeError:需要一个类似字节的对象,而不是'str'
- mongodb - 单个查询有条件的不同操作 - MongoDb
- sql - SQL 查找每个帐户的下一个唯一日期和子帐户
- r - 在R中获取直方图的bin宽度