【问题标题】:Inner Joins Query in HQLHQL 中的内连接查询
【发布时间】:2013-02-10 16:37:33
【问题描述】:

我无法为内部联接执行 HQL,查询在 sql 中执行正确,但在 HQL 中不正确。 我不知道我在哪里失踪。您的帮助很重要。

 ***Error***: org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 148 [SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price FROM com.model.Orders  orders INNER JOIN orders.OrderProcessing as op ON op.u_id = orders.u_id INNER JOIN orders.Product as product ON product.p_id = orders.p_id WHERE product.p_id = '208' ORDER BY op.username]

productList = (List<Orders>) session.createQuery(
 "SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price " +                                                                               
 "FROM Orders orders " +                                                                   
 "INNER JOIN orders.OrderProcessing as op " +                                                                                       
 "ON op.u_id = orders.u_id " +                                                         
 "INNER JOIN orders.Product as product " +                                                              
 "ON product.p_id = orders.p_id " +                                                        
 "WHERE product.p_id = '"+p_id +"' " +                                                         
 "ORDER BY op.username"
).list();

【问题讨论】:

    标签: java sql hibernate hql


    【解决方案1】:

    HQL 中的联接的语法略有不同。

    如果您已经使用 Hibernate 映射了这些关联,则连接条件(用于执行连接的 id 字段)通常由 Hibernate 本身处理(它已经在映射中定义了该信息),所以您只需要指定关联映射到哪个属性,并对其进行连接:

    SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price 
    FROM Orders order
    INNER JOIN order.orderProcessing as op
    INNER JOIN order.product as product 
    ORDER BY op.username
    

    如果您没有映射这些关联,您可能应该使用类似交叉连接的语法,并在WHERE 子句中指定连接条件。请注意,这可能会对效率产生负面影响,具体取决于您的架构结构和 DBMS。

    SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price
    FROM Orders order, OrderProcessing op, Product product
    WHERE op.u_id = order.u_id AND product.p_id = orders.p_id
    ORDER BY op.username
    

    您可以在 Hibernate 参考的 14.3. Associations and joins 部分找到有关 HQL 连接的更多信息。

    【讨论】:

      【解决方案2】:

      HQL 中的联接不像 SQL 中那样工作。您可以加入一个协会:

      select order_1.code, item.code, item.quantity 
       from Order order_1 inner join order_1.item item;
      

      或使用多表选择:

      select order_1.code, item.code, item.quantity 
       from Order order_1, Item item where item.order=order_1;
      

      两种语法各有优劣,应视情况选择。

      值得注意的是,还有一个 隐式 表示法,这可能根本不需要使用连接:

      select item.order.code, item.code, item.quantity from Item item;
      

      【讨论】:

      • 还是不行。选择 op.username、op.email、orders.p_id、orders.o_id" + "FROM Orders order" + "INNER JOIN order.orderProcessing as op" + "INNER JOIN order.product as product" + "where product.p_id= "+p_id+ "按操作用户名排序
      • 如果该字符串连接是直接从您正在使用的代码中获取的,那么您将缺少一些空格 - 在 from Orders order 之前和之后,在 之前whereorder by 子句。如果这不是问题所在,您可能需要先发布您遇到的错误,然后有人才能弄清楚发生了什么(以及如果可能的话,您的业务对象的映射/结构)
      • org.hibernate.hql.ast.QuerySyntaxError:意外令牌:第 1 行附近的订单,第 60 列 [SELECT op.username,op.email,orders.p_id,orders.o_idFROM 订单 orderINNER JOIN 订单。 orderProcessing as op INNER JOIN order.product as productWhere product.p_id=208ORDER BY op.username]
      • 错误清楚地表明您在SELECT 子句中有orders.p_id。您必须使用在FROM 子句中提供的相同别名orderSELECT ..., order.p_id, order.o_id.
      • @DevSingh 就像我之前指出的那样,缺少很多空格 - 在“FROM”之前和第一个“INNER JOIN”之前、“Where”之前和“ORDER BY”之前。另外,请参阅下面的 Mr Spoon 答案,因为它的两个注释也是正确的(order 不能用作别名 - 我在这里的错误是让它滑倒在我的答案中 -并且您不会返回 Orders 列表,而是一些标量值)。
      【解决方案3】:

      我怀疑这是因为order 是保留字(如order by)。尝试改用FROM Orders o

      我想你也会有其他问题。

      查看您选择的内容(一堆随机列值),以及您期望 Hibernate 返回的内容 (List&lt;Orders&gt;)。

      我希望您不会回复List&lt;Orders&gt;,因为您的查询结构将强制休眠进入SQL 模式而不是HQL。在这种模式下,您只会返回一个 List&lt;Object[]&gt;,其中每个 Object[] 是您选择的这四列的集合。

      此链接说明了您可以通过不同的查询获得什么:

      http://www.laliluna.de/jpa-hibernate-guide/ch11s02.html

      【讨论】:

      • 我收到一个错误:org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 148 [SELECT op.username, op.email, orders.p_id, orders .o_id, product.listed_price FROM com.model.Orders orders INNER JOIN orders.OrderProcessing as op ON op.u_id = orders.u_id INNER JOIN orders.Product 作为产品在 product.p_id = orders.p_id WHERE product.p_id = '208 ' ORDER BY op.username]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多