Hibernate 标准与投影相结合

Hibernate 标准与投影相结合,hibernate,criteria,nhibernate-criteria,Hibernate,Criteria,Nhibernate Criteria,我将创建此SQL查询的条件等效项: SQL: 选择 订单号, 书名, orderitem.quantity 来自orderitem book.id=orderitem.book\u id上的内部连接簿 orders.id=orderitem.orders\u id上的内部联接订单 其中user_id=1 这是我的条件查询: Criteria c = getSession().createCriteria(OrderItem.class, "oi"); c.setProjection(Proje

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

SQL:

选择
订单号,
书名,
orderitem.quantity
来自orderitem
book.id=orderitem.book\u id上的内部连接簿
orders.id=orderitem.orders\u id上的内部联接订单
其中user_id=1
这是我的
条件
查询:

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]
使用。它将返回包含字段数量、标题、id的对象数组

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();

我需要以命名键和值而不是索引和值的形式接收结果列表。我用下面的方法

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();