栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SEPARATOR关键字在休眠公式中无法正常工作

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SEPARATOR关键字在休眠公式中无法正常工作

您可以添加

SEPARATOR
为关键字。实现自己
DialectResolver
的关键字,并将关键字 以小写形式 添加到所得的方言中:

public class MyDialectResolver implements DialectResolver {    public Dialect resolveDialect(DialectResolutionInfo info) {        for (Database database : Database.values()) { Dialect dialect = database.resolveDialect(info); if (dialect != null) {     dialect.getKeywords().add("separator");     return dialect; }        }        return null;    }}

对于5.2.13 / 5.3.0 之前的 Hibernate版本相同:

public class MyDialectResolver extends StandardDialectResolver {    protected Dialect resolveDialectInternal(DatabasemetaData metaData) throws SQLException {        Dialect dialect = super.resolveDialectInternal(metaData);        dialect.getKeywords().add("separator");        return dialect;    }}

然后,您将不得不告诉Hibernate使用您的方言解析器。例如,在JPA中,您可以在persistence.xml中执行此操作:

<persistence>  <persistence-unit>    ...    <property name="hibernate.dialect_resolvers" value="mypackage.MyDialectResolver"/>  </persistence-unit></persistence>

其他方言中的汇总功能也是如此。例如,在Oracle中,

WITHIN
缺少关键字。

还有另一种选择,它更独立于数据库(我更喜欢)。创建以下内容

SQLFunction

public class ListAggFunction implements SQLFunction {        private String pattern;        public ListAggFunction() {        this("LISTAGG(DISTINCT {path}, {separator}) WITHIN GROUP(ORDER BY {orderByPath})");    }        public ListAggFunction(String pattern) {        this.pattern = pattern;    }    public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {        return StringType.INSTANCE;    }    public boolean hasArguments() {        return true;    }    public boolean hasParenthesesIfNoArguments() {        return true;    }    public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) throws QueryException {        if (arguments.isEmpty() || arguments.size() > 3) { throw new IllegalArgumentException(         "Expected arguments for 'listagg': path [, separator [, order by path]]");        }        String path = (String) arguments.get(0);        String separator = arguments.size() < 2 ? "''" : (String) arguments.get(1);        String orderByPath = arguments.size() <= 2 ? path : (String) arguments.get(2);        return StringUtils.replaceEach(this.pattern, new String[] { "{path}", "{separator}", "{orderByPath}" },     new String[] { path, separator, orderByPath });    }}

您可以使用与上面的关键字相同的方式在DialectResolver中注册此功能:

 if ("MySQL".equals(info.getDatabaseName()) || "H2".equals(info.getDatabaseName())) {   dialect.getFunctions().put("listagg", new ListAggFunction("GROUP_CONCAt(DISTINCT {path} ORDER BY {orderByPath} SEPARATOR {separator})")); } else {   dialect.getFunctions().put("listagg", new ListAggFunction()); }

现在,您可以在JPQL / HQL / Criteria查询中使用此功能,而无需考虑方言的语法:

 SELECT e.group, listagg(e.stringProperty, ', ') FROM Entity e GROUP BY e.group


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号