【问题标题】:Hibernate criteria query休眠条件查询
【发布时间】:2011-06-08 15:14:51
【问题描述】:

我正在尝试使用 Hibernate 标准 api 执行子查询,但无法完全弄清楚如何去做。假设有 2 个表,SHOPS 和 EMPLOYEES,其中 SHOPS 包含所有商店信息,EMPLOYEES 是所有商店中所有员工的大表(未设置外键)。我正在尝试编写一个查询,该查询从 SHOPS 表中检索商店 ID 和地址,然后通过连接和 EMPLOYEES 表中的计数来检索商店中的雇员人数。像这样的:

SELECT a.SHOP_ID, a.SHOP_ADDRESS, (SELECT COUNT(*) FROM
SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID) as NUM_EMPLOYEES FROM   <--Problem here
SHOPS a
WHERE
QUERY_STATUS ='Open'

所以我有一个 Java 类 Shop,其中包含 shopId、shopAddres、numEmployees 和类似的Employees。

我的子查询:

DetachedCriteria subquery = DetachedCriteria.forClass(
  Employee.class, "b").add(
  Property.forName("b.shopId").eqProperty("a.shopId"))
  .setProjection(
    Projections.projectionList().add(
      Projections.rowCount()));

主要条件查询如下:

List shopListRet = session.createCriteria(Shop.class, "a")
  .setProjection(
    Projections.projectionList().add(
      Projections.property("a.shopId"))).add(Subquery..."DONT KNOW WHAT SHOULD COME HERE").list();

我的问题是:

  • 如何将 Detached 查询关联为子查询,以将计数结果收集到 Shop 类中的类变量 numEmployees 中?

谢谢 -J

【问题讨论】:

    标签: hibernate criteria hibernate-criteria


    【解决方案1】:

    使用 SQL 投影添加子查询。

      String subSql = "SELECT COUNT(*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID"
    ...
        .add( Projections.sqlProjection(
            subSql ,
            new String[] { "NUM_EMPLOYEES" },
            new Type[] { Hibernate.LONG }
        );
    

    【讨论】:

    • 您好,感谢您的回复。我不得不稍微调整查询以适应别名。像这样: String subSql = "(SELECT COUNT(*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID={alias}.SHOP_ID) as NUM_EMPLOYEES"。之后工作。我接受你的答案是正确的 - 干杯 - J
    猜你喜欢
    • 2011-04-13
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多