【问题标题】:Hibernate criteria query with INNER JOIN, LEFT JOIN, GROUP_CONCAT and DISTINCT使用 INNER JOIN、LEFT JOIN、GROUP_CONCAT 和 DISTINCT 进行休眠条件查询
【发布时间】:2015-02-03 06:03:34
【问题描述】:

过去几个月我一直在使用休眠 CRITERIA,我通常进行研发并从 SQL 创建 CRITERIA 查询。但这次我真的对下面的查询感到困惑。我不明白从哪里开始。

表映射:

SQL 查询:

SELECT templates.TEMPLATE_ID,
       templates.TEMPLATE_NAME,
       template_categories.CATEGORY_DESC,
       GROUP_CONCAT(DISTINCT template_code_values.Code_Value) as Code_Valuess
  FROM (client1408.templates templates
       LEFT JOIN
        client1408.template_code_mapping template_code_mapping
           ON (template_code_mapping.Template_ID = templates.TEMPLATE_ID))
       LEFT JOIN client1408.template_code_values template_code_values
          ON (template_code_mapping.Template_Code_Value_ID = template_code_values.ID)
       INNER JOIN client1408.template_categories template_categories
            ON (templates.CATEGORY_ID = template_categories.CATEGORY_ID)   
GROUP BY templates.TEMPLATE_ID

我做了什么:

使用标准映射templatestemplate_categories

Criteria templateSearchCriteria = session.createCriteria(Templates.class).createAlias("Category", "category")
                                     .setProjection(Projections.projectionList()
                                     .add(Projections.property("Id"), "Id")
                                     .add(Projections.property("TemplateName"), "TemplateName")
                                     .add(Projections.property("Category"), "Category")
                                     .setResultTransformer(Transformers.aliasToBean(Templates.class));

还剩什么:

  • 在查询 template_code_valuestemplate_code_mapping 以及 LEFT JOINGROUP BY 中添加更多 2 个表。
  • GROUP_CONCAT 与 DISTINCT 作为额外的列添加

【问题讨论】:

    标签: sql hibernate join hibernate-criteria


    【解决方案1】:

    hibernate 中的Join 很简单,使用createAlias 和JoinType。对于 Distinct 和 grouping,我们必须使用投影。检查以下示例:

        Criteria criteria = getHibernateSession().createCriteria(A.class);
        criteria.createAlias("b", "b", JoinType.INNER_JOIN);
        criteria.createAlias("b.r", "b.r", JoinType.INNER_JOIN);
        criteria.createAlias("b.c", "b.c", JoinType.LEFT_OUTER_JOIN);
        ProjectionList projectionList = Projections.projectionList();
        // THE BELOW LINE WILL MAKE SURE COULMN a IS DISTINCT
        projectionList.add(Projections.distinct(Projections.property("a")), "a");
        // THE BELOW LINKE WILL GROUP IT BY COLUMN c
        projectionList.add(Projections.groupProperty("c"));
        // ADD all the fields that u want in projection
        criteria.setProjection(projectionList);
        criteria.setResultTransformer(Transformers.aliasToBean(A.class));
        return criteria.list();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2015-01-10
      • 2014-07-30
      • 1970-01-01
      • 2014-03-13
      • 2012-08-17
      • 1970-01-01
      相关资源
      最近更新 更多