首页 > 解决方案 > 映射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 返回价值?

标签: javahibernatejpajdbchql

解决方案


左外连接返回第一个表中的所有行,只返回第二个表中匹配的行。(虽然 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 ";

推荐阅读