如何在hibernate标准中使用group_concat?

时间:2014-10-06 04:31:08

标签: sql hibernate

我在mysql中使用group_concat编写了一个查询,如

SELECT c1,group_concat(c2) FROM table1 where sno in(1,4,8,10) group by c1;

并给出我的预期结果。

现在我想用hibernate标准编写相同的查询。

4 个答案:

答案 0 :(得分:2)

您有两个选择(取决于您的休眠版本)。

覆盖方言类 任何休眠版本

您将需要对方言进行子类化以添加group_concat()

  1. 介绍方言替代类

在应用中的某个位置(例如util包)创建以下类

package com.myapp.util;

import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;

public class MySQLCustomDialect extends MySQL5Dialect {
    public MySQLCustomDialect() {
        super();
        registerFunction("group_concat", 
            new StandardSQLFunction("group_concat", 
                StandardBasicTypes.STRING));
    }
}
  1. 将方言替代类映射为引导属性

将以下属性添加到您的应用程序。属性

spring.jpa.properties.hibernate.dialect = com.myapp.util.MySQLCustomDialect

使用JPA Metadata Builder贡献者 仅休眠5.2.18或更高版本

  1. 介绍元数据生成器类

创建以下类,记得添加包并解析导入。

public class SqlFunctions implements MetadataBuilderContributor {

@Override
public void contribute(MetadataBuilder metadataBuilder) { 
    metadataBuilder.applySqlFunction( "group_concat", 
        new StandardSQLFunction( "group_concat", 
            StandardBasicTypes.STRING ) ); }
}
  1. 在应用程序启动属性中映射新类

保留方言属性

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.metadata_builder_contributor = com.myapp.util.SqlFunctions

答案 1 :(得分:1)

简单回答是

<强>为什么吗

Hibernate仅支持多个数据库中使用的常用函数/语法。 Microsoft SQL Server中没有任何group_concat函数,也可能在其他数据库中。

<强>解决方案:

您必须将其作为简单SQL查询执行。

答案 2 :(得分:0)

请参阅以下代码段,可能会回答您的问题。

标准cr = session.createCriteria(table1.class);

cr.add(Restrictions.in(&#34; SNO&#34;,snoarray));

criteria.setProjection(&#34; C1&#34);

criteria.setProjection(Projections.groupProperty(&#34; C1&#34));

答案 3 :(得分:0)

最后,我按照下面的代码进行操作并得到预期的结果

字符串查询=“从table1中选择c1,group_concat(c2),其中sno in(:pageIds)group by c1”;

SQLQuery sqlQuery = session.createSQLQuery(query);

sqlQuery.setParameterList(“pageIds”,myList);

列表list = sqlQuery.list();

c1 group_concat(c2)

aaa valu1,value2 bbb value3 ccc value4,value5,value6