我在mysql中使用group_concat编写了一个查询,如
SELECT c1,group_concat(c2) FROM table1 where sno in(1,4,8,10) group by c1;
并给出我的预期结果。
现在我想用hibernate标准编写相同的查询。
答案 0 :(得分:2)
您有两个选择(取决于您的休眠版本)。
覆盖方言类 任何休眠版本
您将需要对方言进行子类化以添加group_concat()
在应用中的某个位置(例如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));
}
}
将以下属性添加到您的应用程序。属性
spring.jpa.properties.hibernate.dialect = com.myapp.util.MySQLCustomDialect
使用JPA Metadata Builder贡献者 仅休眠5.2.18或更高版本
创建以下类,记得添加包并解析导入。
public class SqlFunctions implements MetadataBuilderContributor {
@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction( "group_concat",
new StandardSQLFunction( "group_concat",
StandardBasicTypes.STRING ) ); }
}
保留方言属性
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();
aaa valu1,value2 bbb value3 ccc value4,value5,value6