【问题标题】:Changing sql to hql with joins使用连接将 sql 更改为 hql
【发布时间】:2012-05-23 13:35:54
【问题描述】:

我的 hql 查询似乎有什么问题?

String queryString = "SELECT A.INITIAL, A.NUMBER, A.OWNR_SCAC , A.INITIAL||A.NUMBER AS CAR," + 
            "A.LESSEE_SCAC, A.TRUK_CNT, A.EQP_TYP_CD, A.AXL_CNT, B.STABILITY_DEV_EQP," +
            "A.C_CNT, A.G_WGT, B.TRUK_AXL_CNT, A.EIN FROM DS.E_UT AS A" +
            "LEFT JOIN DS.E_PRIMARY AS B" +
            "WHERE A.INITIAL||A.NUMBER IN (:carList) AND A.INITIAL IN {:initList) AND A.NUMBER IN (:numberList)" + 
            "AND B.TRUK_AXL_CNT > 0";

错误:

org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌: 靠近第 1 行第 263 列

我假设它在谈论FROM DS.E_UT AS A之后的A

【问题讨论】:

  • 你能显示你的休眠映射类或文件吗?

标签: sql hibernate hql


【解决方案1】:

在 HQL 中,您确实提供表名和列名。相反,您提供映射到表和列的类和成员变量的 Java 类名称和成员变量名称(或 getter/setter)名称。

【讨论】:

  • 如果一个变量在另一个类中(连接变量)...我如何引用它?
  • 使用(例如)from ClassA inner join ClassB where ClassA.variable = ...from ClassA A inner join ClassB B where A.variable = ...
  • 好的,当我将 ClassB.variable 添加到查询中时,我得到“无效路径:'null.TRUK_AXL_CNT'”
  • 我猜 TRUK_AXL_CNT 是列的数据库名称。您必须使用类成员名称,某事。喜欢B.trukAxlCnt > 0。请提供这两个表的映射文件;如果不是,那只是猜测。
【解决方案2】:

我认为你应该在每一行添加一些空格。

"A.C_CNT, A.G_WGT, B.TRUK_AXL_CNT, A.EIN FROM DS.E_UT AS A" +
"LEFT JOIN DS.E_PRIMARY AS B"

会变成:

A.C_CNT, A.G_WGT, B.TRUK_AXL_CNT, A.EIN FROM DS.E_UT AS ALEFT JOIN DS.E_PRIMARY AS B

注意'ALEFT'

【讨论】:

    【解决方案3】:

    我不完全确定您的架构,或者这是否是您正在寻找的内容,但您可以将连接的表映射在一起。这可以使事情变得更容易一些,并且您不需要显式地加入您的查询。

    Here is a small example

    该示例中的示例查询可能类似于:

    SELECT p 
        FROM Person 
    WHERE p.name like :name 
    AND p.address.street like :street
    

    【讨论】:

    • 如果我这样做呢?我的查询将如何形成?
    • 您将编写引用您的对象的查询,因为它们在您的架构中命名。我根据示例链接添加了一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多