【问题标题】:Hibernate Error: could not extract ResultSet休眠错误:无法提取结果集
【发布时间】:2019-01-25 12:02:44
【问题描述】:

我的代码中有这个错误:

"Request processing failed; nested exception is javax.persistence.PersistenceException: 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet] con causa raíz
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-206, 
SQLSTATE=42703, SQLERRMC=INVOICESEL2_.CODE_K, DRIVER=4.14.88"

我找不到错误,我知道 SQL 代码 -206 指的是在无效的上下文中指定了一个对象。

我的代码是这样的:

public InvoiceSeller getSellerByEmail(String email, String debtorCode) {

    String qString = "SELECT d FROM  " + InvoiceSeller.class.getSimpleName() + " d "
            + " INNER JOIN "+ InvoiceSellerContact.class.getSimpleName() + " sc "
            + " ON d.code = sc.invoiceSeller.code AND d.invoiceDebtor.code = sc.invoiceSeller.invoiceDebtor.code "
            + " INNER JOIN "+ Contact.class.getSimpleName() + " c ON sc.contact.id = c.id "
            + " INNER JOIN " + ActiveRegisterMaster.class.getSimpleName() + " a "
            + " ON d.code = a.code AND d.invoiceDebtor.code = a.invoiceDebtor "
            + " WHERE a.tableName = :tablename AND d.invoiceDebtor.code = :debtorCode "
            + " AND c.email = :email AND d.status = :status";


    TypedQuery<InvoiceSeller> query = this.em.createQuery(qString, InvoiceSeller.class);
    System.out.println(qString);

    System.out.println(query.getFirstResult());

    query.setParameter("debtorCode", debtorCode);
    query.setParameter("email", email);
    query.setParameter("tablename", InvoiceSeller.TABLENAME);
    query.setParameter("status", "A");

    InvoiceSeller seller = query.getSingleResult();

    System.out.println(seller.toString());

    return seller;
}

谢谢!

【问题讨论】:

  • -206 代码是object-name IS NOT VALID IN THE CONTEXT WHERE IT IS USED,请发布生成的 SQL,您的 HQL 中可能使用了不正确的字段或映射

标签: java database hibernate


【解决方案1】:

您的 HQL 错误,请记住 HQL sintax 与 SQL 不同,当您调用 this.em.createQuery 时,您正在尝试创建 HQL。

所以,你的 HQL 应该是这样的:

 String qString = "SELECT d FROM  " + InvoiceSeller.class.getSimpleName() + " d "
            + " INNER JOIN "+ InvoiceSellerContact.class.getSimpleName() + " sc "
            + " INNER JOIN "+ Contact.class.getSimpleName() + " c "
            + " INNER JOIN " + ActiveRegisterMaster.class.getSimpleName() + " a "
            + " WHERE a.tableName = :tablename AND d.invoiceDebtor.code = :debtorCode "
            + " AND c.email = :email AND d.status = :status";
            + " AND c.email = :email AND d.status = :status";

请注意,我在 INNER JOIN 之后删除了 ON 关键字,因为 HQL 不需要它。

【讨论】:

  • 我们使用 ON 是因为 ActiveRegisterMaster 与 InvoiceSeller 没有任何关系。此外,当我们删除 ON 时,我们会收到 104 错误。
  • 如果 ActiveRegisterMaster 与 InvoiceSeller 没有关系,则您无法在 HQL 中进行 INNER JOIN,您需要一个 nativeQuery 来强制它。但我真的建议您检查您的映射,因为 INNER JOIN 对于不存在的关系没有意义。无论如何,在 HQL 中不能使用 ON 关键字。
  • 我们已经将 TypedQuery 与 ActiveRegisterMaster 和其他不相关的表一起使用,使用 INNER JOIN 和 ON 并且查询完全正常
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 2013-10-02
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2016-10-24
  • 2013-06-13
相关资源
最近更新 更多