Java RuntimeException:org.hibernate.exception.sqlgrammareException:无法执行查询

Java RuntimeException:org.hibernate.exception.sqlgrammareException:无法执行查询,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我正在使用另一个表联接从一个名为PurchaseDetailContributor的表中检索记录。但我得到的查询错误 下面是我的DAOHibernate.java类,我在其中编写了一个方法 @SuppressWarnings("unchecked") public List<PurchaseDetailContributor> getPurchaseDetailContributorByCustomerNo(Integer customer_no) { System.out.

我正在使用另一个表联接从一个名为PurchaseDetailContributor的表中检索记录。但我得到的查询错误

下面是我的DAOHibernate.java类,我在其中编写了一个方法

@SuppressWarnings("unchecked")
public List<PurchaseDetailContributor> getPurchaseDetailContributorByCustomerNo(Integer customer_no) {
    System.out.println("The Customer number in PurchaseDetailContributorDAOHIbernate >>>>" + customer_no);
    String sql = " SELECT * FROM purchase_detail_contributor pdc "
             + " INNER JOIN purchasedetail pd ON pdc.purchase_detail_id = pd.purchasedetailid "
             + " INNER JOIN purchase p ON pd.purchasefk = p.purchaseid " 
             + " INNER JOIN user u ON u.userid = p.userid AND u.customer_no = " +customer_no;

    List<PurchaseDetailContributor> pdcList = new ArrayList<PurchaseDetailContributor>();
    Transaction tx = null;
    Session session = getHibernateTemplate().getSessionFactory().openSession();
    try{
        tx = session.beginTransaction();
        SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(PurchaseDetailContributor.class);
        //sqlQuery.setInteger("customer_no", customer_no);
        pdcList = sqlQuery.list();
        tx.commit();
    }catch (RuntimeException e) {
        System.out.println("getPurchaseDetailContributorByCustomerNo() >>>>- RuntimeException: " + e);
        if (tx != null && tx.isActive()) {
            try {
                // Second try catch as the rollback could fail as well
                tx.rollback();
            } catch (HibernateException e1) {
                System.out.println("Error rolling back transaction: " + e1);
            }
        }
    } finally {
        session.disconnect();
    }

sql中没有空格

String sql = "select * from purchase_detail_contributor"
         + "inner join purchasedetail on (purchase_detail_contributor.purchase_detail_id = purchasedetail.purchasedetailid)"
         + "inner join purchase on (purchasedetail.purchasefk = purchase.purchaseid)" 
         + "inner join user on (user.userid = purchase.userid)"
         + "where user.customer_no = :customer_no";
所以sql是

select * from purchase_detail_contributorinner join purchasedetail...

这肯定是语法错误

sql中没有空格

String sql = "select * from purchase_detail_contributor"
         + "inner join purchasedetail on (purchase_detail_contributor.purchase_detail_id = purchasedetail.purchasedetailid)"
         + "inner join purchase on (purchasedetail.purchasefk = purchase.purchaseid)" 
         + "inner join user on (user.userid = purchase.userid)"
         + "where user.customer_no = :customer_no";
所以sql是

select * from purchase_detail_contributorinner join purchasedetail...

这肯定是语法错误

您发布了正确的代码吗

正如它所显示的错误

11:13:01,074 ERROR [JDBCExceptionReporter:234] Column 'is_approved' not found.

你发了正确的代码吗

正如它所显示的错误

11:13:01,074 ERROR [JDBCExceptionReporter:234] Column 'is_approved' not found.

添加“内部联接”和“where”子句时需要一些空格,否则sql将类似于“select*from PUSHARE\u detail\u contributorinner join…”,谢谢,现在我按照大家的建议更改了sql查询,但仍然出现以下错误org.hibernate.exception.sqlgrammareexception:无法执行查询您可以在提交sql并将其添加到问题之前打印您的sql吗?我不明白您的意思……请您修改我代码中的错误。以帮助我们理解可能出现什么问题,您可以添加一些信息吗?例如,完整的stacktrace和/或sql变量的值?在添加“内部联接”和“where”子句时,您需要一些空格,否则您的sql将类似于“select*from purchase\u detail\u contributorinner join…”,谢谢,现在我按照大家的建议更改了sql查询,但仍然出现以下错误org.hibernate.exception.sqlgrammareexception:无法执行查询您可以在提交sql并将其添加到问题之前打印您的sql吗?我不明白您的意思……请您修改我代码中的错误。以帮助我们理解可能出现什么问题,您可以添加一些信息吗?例如,完整的stacktrace和/或sql变量的值?创建查询时,必须始终设置参数,如
user.customer\u no=:cno
,然后调用
setParameter(“cno”,customer\u no)
,以防sql注入攻击。这个更安全,因为它是一个整数对象,但是如果你在一个地方这样做,可以安全地假设你在更多地方这样做。创建查询时,你必须始终设置参数,如
user.customer\u no=:cno
,然后调用
setParameter(“cno”,customer\u no)
以防止SQL注入攻击。这一个更安全,因为它是一个整数对象,但是如果你在一个地方这样做,可以安全地假设你在更多地方这样做。