SpringBoot + Spring data JPA使用方言(自定义函数、一些自带函数)

本人之前一直用mybitis,现在项目上使用jpa,给我带来了极大的方便,但也遇到一些问题。下列需求是这样的,我要根据id in 筛选出符合条件的数据,并将其中的某个字段,拼接起来返回。用原生sql比较简单,使用GROUP_CONCAT 函数即可。

SELECT GROUP_CONCAT(`name`) `names` FROM `face_machine` WHERE id in (1,2,3);

但使用jpa(非原生sql,因为很多地方都用到了,且使用原生sql,数据处理起来比较麻烦) 就会有问题了,我项目中jpa底层是使用的hibernate,所以要研究出如何使用hql语句来使用GROUP_CONCAT函数。

首先,dao层方法是这样的

    @Query(value = "select GROUP_CONCAT(fm.name) as names from FaceMachine fm where id in (?1)")
    String findNamesByIds(List<Integer> list);

这样直接使用是不行的,因为GROUP_CONCAT不是常用的函数。需要配置方言了。

要自定义一个MySQLDialect类

package com.ymkj.property.dialect;

import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.StandardSQLFunction;

/**
 * @author zhengyue
 * @data 2019-08-06 11:16
 */
public class MyMysqlDialect extends MySQLDialect{

    public MyMysqlDialect() {
        super();
        registerFunction("GROUP_CONCAT", new StandardSQLFunction("GROUP_CONCAT"));

    }
}

然后需要在配置文件中添加配置,我的配置文件是xml

spring:    
# jap自动创建表及打印sql
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: com.ymkj.property.dialect.MyMysqlDialect
    database: mysql

主要是spring.properties.hibernate.dialect=com.ymkj.property.dialect.MyMysqlDialect (自定义的类)

//-------------------------------------------------------遇到以下问题------------------------------------------------------------------------------------//

刚开始按上述操作,启动并无问题,但若有需要新创建的表,就会出现问题,会报错,表也不会被创建出来。查了很多,都说是因为方言问题。确实是方言问题。下面附上解决方法:

package com.ymkj.property.dialect;

import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.StandardSQLFunction;

/**
 * @author zhengyue
 * @data 2019-08-06 11:16
 */
public class MyMysqlDialect extends MySQLDialect {

    public MyMysqlDialect() {
        super();
        registerFunction("GROUP_CONCAT", new StandardSQLFunction("GROUP_CONCAT"));
    }
//此处是解决创建表报错问题
    @Override
    public String getTableTypeString() {
        return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值