当前位置: 首页 > 知识库问答 >
问题:

JPA SQLQuery不适用于java实体

史谦
2023-03-14

我用Spring和Hibernate开发了我的Java应用程序,我有两个实体。

@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();
    }   
    
}

我创建我的服务类别,以获得Hibernate的结果

@Service
@Transactional
public class MyServiceImpl implements MyService {
    private static final long serialVersionUID = 8393594103219622298L;

    private static final String MY_REQUEST 
        ="SELECT us.login, cd.date, us.password "+
    " FROM user us , commande cd "+ 
    " WHERE "+
    " us.idUser = cd.user.idUser AND "+
    " us.idUser = 1 ";
    
    public List<Object> findUsersCmd() {
        String query1 = MY_REQUEST;
        SQLQuery queryObj = sessionFactory.getCurrentSession().createSQLQuery(query1);
        List<Object> lstObj =queryObj.list(); 
        return lstObj;
    }
    
}

当我调试时,我在这一行中得到这个错误:

List<Object> lstObj =queryObj.list();

104165[http-bio-8080-exec-3]警告组织。冬眠util。JDBCExceptionReporter-SQL错误:904,SQLState:42000

104166[http-bio-8080-exec-3]错误组织。冬眠util。JDBCExceptionReporter-ORA-00904:“美国”。“IDUSER”:标识无效

我如何解决我的问题?

共有1个答案

潘智刚
2023-03-14

如果你想运行一个JPA查询,它应该看起来像这样:

private static final String MY_REQUEST =
          "SELECT us.login, cd.date, us.password " +
          "FROM User us JOIN us.commands cd " +
          "WHERE us.idUser = 1";

并确保使用createQuery

List<Object[]> = sessionFactory.getCurrentSession().createQuery(MY_REQUEST)
    .list();

createSQLQuery用于运行本机SQL查询。在这种情况下,它看起来像:

private static final String MY_REQUEST = 
    "select us.USER_ID, cd.CMD_DATE, us.USER_PASSWORD " +
    "from Users us JOIN ComaCommands cd ON us.USER_ID = cd.USER_ID " +
    "where us.USER_ID = 1";


List<Object[]> = sessionFactory.getCurrentSession().createSQLQuery(MY_REQUEST)
    .list();

但是您应该尽可能使用JPQL查询。

 类似资料:
  • 由于catalina.sh中的默认“java.endorsed.dirs”选项,无法用Java9启动基于tomcat的应用程序。 这方面有什么工作吗?

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 问题内容: 2014年11月29日更新- 这仍然是一个问题,Godaddy似乎不在乎也不会对此做任何事情。几个月前,Godaddy安全产品副总裁在这里发表了一篇博客文章,指出正在修复该问题,并提供了一种临时解决方法,但是到目前为止,没有任何变化。重要的是要注意,Godaddy的G2 CA服务器已经存在至少5年了,在那时,Godaddy尚未采取适当的步骤来解决此已知问题。提供的解决方法仅是一种解决方

  • 问题内容: 我有一个这样的字符串:现在我想用实际的换行符替换\ n,这样它将变成 理发师 这是我的代码 但是它不起作用并且给我相同的字符串 问题答案: 您需要做: 该方法在其第一个参数中期望使用正则表达式。当在Java字符串中传递2时,您实际上传递了1。问题是,是一种逃避字符也正则表达式,因此正则表达式是actualy ,所以你需要把额外的两次。

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。