映射hibernate SQLQuery native返回java实体中的空对象
我的oracle数据库中有两个表 和两个实体用户和命令映射hibernate SQLQuery native返回java实体中的空对象,java,hibernate,jpa,jdbc,hql,Java,Hibernate,Jpa,Jdbc,Hql,我的oracle数据库中有两个表 和两个实体用户和命令 @Entity @Table(name = "Users") public class User { private int idUser; private String login; private String password; private List<Command> commands = new ArrayList<>
@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();
}
}
@实体
@表(name=“Users”)
公共类用户{
私有用户;
私有字符串登录;
私有字符串密码;
private List commands=new ArrayList();
公共用户(){}
公共用户(字符串登录,字符串密码){
超级();
this.setLogin(login);
此.setPassword(密码);
}
@身份证
@列(name=“USER\u ID”,unique=true,nullable=false,scale=0)
public int getIdUser(){
返回idUser;
}
@列(name=“USER\u LOGIN”,null=false)
公共字符串getLogin(){
返回登录;
}
公共void setLogin(字符串登录){
this.login=登录;
}
@列(name=“USER\u PASSWORD”,null=false)
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
@OneToMany(fetch=FetchType.LAZY,mappedBy=“利用者”)
公共列表getCommands(){
返回命令;
}
公共字符串toString(){
返回this.idUser+“:“+this.login+”/“+this.password”
;
}
}
@实体
@表(name=“Commands”)
公共类命令{
私有int-idCommand;
私人用户利用者;
私人日期;
公共命令(){}
公共命令(用户,日期命令日期){
this.setUser(用户);
这个.setCommandDate(commandDate);
}
@身份证
@列(name=“CMD_Id”,unique=true,nullable=false,scale=0)
公共int getIdCommand(){
返回id命令;
}
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“USER\u ID”)
公共用户getUsilizateur(){
返回用户;
}
公共无效设置用户(用户){
this.user=用户;
}
@列(name=“CMD_DATE”)
@时态(TemporalType.TIMESTAMP)
公共日期getCommandDate(){
返回命令日期;
}
公共无效setCommandDate(日期commandDate){
this.commandDate=commandDate;
}
公共字符串toString(){
StringBuilder=新的StringBuilder();
builder.append(“Commande de>>”).append(this.user)
.append(“-”).append(this.commandDate).append(“\n”);
返回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;
}
}
@服务
@交易的
公共类MyServiceImpl实现了MyService{
私有静态最终长serialVersionUID=8393594103219622298L;
私有静态最终字符串MY_ADVANCED_请求
=“选择us.USER\U ID、cd.CMD\U日期、us.USER\U密码”+
“从用户us,命令us上的cd.USER\U ID=cd.USER\U ID”+
“其中us.USER\u ID=cd.USER\u ID”+
“和us.USER_ID=5”;
公共列表findUsersCmd(){
字符串query1=我的高级请求;
sqlqueryqueryobj=sessionFactory.getCurrentSession().createSQLQuery(query1);
List lstObj=queryObj.List();
返回lstObj;
}
}
我在这一行中得到一个空列表list lstObj=queryObj.list()
我使用的是请求SQLQuery,而不是jpa
我想为us.USER\u ID=5得到1个对象(即使我在表命令中没有us.USER\u ID=5),为us.USER\u ID=1得到3个对象(因为命令表中有3行);用户ID=6(因为Commands表中有1行)
如何解决为我的us.USER\u ID=5返回值的问题?左外部联接返回第一个表中的所有行,而仅返回第二个表中匹配的行。(虽然commands表中不存在用户\u 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 ";