【问题标题】:Criteria join with projection标准加入投影
【发布时间】:2015-05-03 22:02:47
【问题描述】:

我将创建此 SQL 查询的 Criteria 等效项:

SQL:

SELECT
  orders.id,
  book.title,
  orderitem.quantity

  FROM orderitem
    INNER JOIN book ON book.id = orderitem.book_id
    INNER JOIN orders ON orders.id = orderitem.orders_id

WHERE user_id = 1

这是我的Criteria 查询:

Criteria c = getSession().createCriteria(OrderItem.class, "oi");
c.setProjection(Projections.property("quantity"));

c.createAlias("oi.book", "book");
c.setProjection(Projections.property("title"));
c.createAlias("oi.orders", "or");
c.setProjection(Projections.property("id"));
c.createAlias("or.user", "usr");

c.add(Restrictions.eq("usr.id", "1"));
return c.list();

它也不例外,但它只显示Orders.id 列:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 22]

【问题讨论】:

    标签: hibernate criteria nhibernate-criteria


    【解决方案1】:

    使用 ProjectionList 。它将返回包含字段数量、标题、id 的 Object 数组。

    Criteria c = getSession().createCriteria(OrderItem.class, "oi");
    c.createAlias("oi.book", "book");
    c.createAlias("oi.orders", "or");
    c.createAlias("or.user", "usr");
    
    ProjectionList proList = Projections.projectionList();
    proList.add(Projections.property("oi.quantity"));
    proList.add(Projections.property("book.title"));
    proList.add(Projections.property("or.id"));
    c.setProjection(proList);
    c.add(Restrictions.eq("usr.id", "1"));
    return c.list();
    

    【讨论】:

      【解决方案2】:

      我需要将结果列表作为命名键和值而不是索引和值来接收。我使用了以下方式。

      Criteria c = getSession().createCriteria(OrderItem.class, "oi");
      c.createAlias("oi.book", "book");
      c.createAlias("oi.orders", "or");
      c.createAlias("or.user", "usr");
      
      ProjectionList proList = Projections.projectionList();
      proList.add(Projections.property("oi.quantity"), "quantity");
      proList.add(Projections.property("book.title"), "title");
      proList.add(Projections.property("or.id"), "id");
      c.setProjection(proList);
      
      c.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
      
      c.add(Restrictions.eq("usr.id", "1"));
      return c.list();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-21
        • 2011-04-11
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        相关资源
        最近更新 更多