PostgreSQL 、springboot 、spring data jpa 集成

  项目地址:https://gitee.com/zhxs_code/PostgreSQL_springboot_jpa_demo.git

      增删查改都已经实现。

  重点部分:

    1.定义自己的方言。

    

 1 package com.zxl.postgrespringdemo.config.dialect;
 2 
 3 import org.hibernate.dialect.PostgreSQL94Dialect;
 4 import org.hibernate.type.StringType;
 5 
 6 import java.sql.Types;
 7 
 8 public class JsonbPostgresDialect extends PostgreSQL94Dialect {
 9     public JsonbPostgresDialect() {
10         super();
11         registerColumnType(Types.JAVA_OBJECT, "jsonb");
12         registerHibernateType(Types.ARRAY, StringType.class.getName());
13     }
14 
15 
16 }
View Code

    2. 配置文件中声明使用自己定义的方言 (yml格式)

  

database-platform: com.zxl.postgrespringdemo.config.dialect.JsonbPostgresDialect
View Code

    3.编写自己的json转换类型,用来实现json类型与Postgre类型的转换

package com.zxl.postgrespringdemo.config;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.hibernate.HibernateException;
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.SerializationException;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;
import org.postgresql.util.PGobject;
import org.springframework.util.ObjectUtils;import java.io.IOException;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Properties;public class JsonbType implements UserType, ParameterizedType {private final ObjectMapper mapper = new ObjectMapper();private static final ClassLoaderService classLoaderService = new ClassLoaderServiceImpl();public static final String CLASS = "CLASS";private Class<?> jsonClassType;@Overridepublic void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {if (value == null) {st.setNull(index, Types.OTHER);} else {try {st.setObject(index, mapper.writeValueAsString(value), Types.OTHER);} catch (IOException e) {e.printStackTrace();}}}@Overridepublic Object deepCopy(Object originalValue) throws HibernateException {if (originalValue != null) {try {return mapper.readValue(mapper.writeValueAsString(originalValue),returnedClass());} catch (IOException e) {throw new HibernateException("Failed to deep copy object", e);}}return null;}@Overridepublic Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {PGobject o = (PGobject) rs.getObject(names[0]);if (o.getValue() != null) {return JSON.parseObject(o.getValue(), jsonClassType);}return null;}@Overridepublic Serializable disassemble(Object value) throws HibernateException {Object copy = deepCopy(value);if (copy instanceof Serializable) {return (Serializable) copy;}throw new SerializationException(String.format("Cannot serialize '%s', %s is not Serializable.", value, value.getClass()), null);}@Overridepublic Object assemble(Serializable cached, Object owner) throws HibernateException {return deepCopy(cached);}@Overridepublic Object replace(Object original, Object target, Object owner) throws HibernateException {return deepCopy(original);}@Overridepublic boolean isMutable() {return true;}@Overridepublic int hashCode(Object x) throws HibernateException {if (x == null) {return 0;}return x.hashCode();}@Overridepublic boolean equals(Object x, Object y) throws HibernateException {return ObjectUtils.nullSafeEquals(x, y);}@Overridepublic Class<?> returnedClass() {return jsonClassType;}@Overridepublic int[] sqlTypes() {return new int[]{Types.JAVA_OBJECT};}@Overridepublic void setParameterValues(Properties properties) {final String clazz = (String) properties.get(CLASS);if (clazz != null) {jsonClassType = classLoaderService.classForName(clazz);}}
}
View Code

    4.demo实体类

 1 /**
 2  * 用户demo类
 3  */
 4 @Data
 5 @AllArgsConstructor
 6 @NoArgsConstructor
 7 @Entity
 8 @Table(name = "user_demo")
 9 @TypeDefs({
10         @TypeDef(name = "infoType", typeClass = JsonbType.class, parameters = {
11                 @Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.UserBaseInfo")
12         }),
13         @TypeDef(name = "addressType", typeClass = JsonbType.class, parameters = {
14                 @Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.Address")
15         })
16 })
17 public class UserDemo {
18 
19     @Id
20     @GeneratedValue
21     private Long id;
22 
23     @Column(columnDefinition = "jsonb")
24     @Type(type = "addressType")
25     private Address address;
26 
27 
28     @Column(columnDefinition = "jsonb")
29     @Type(type = "infoType")
30     private UserBaseInfo info;
31 }
View Code

    5. 执行原生的SQL语句

@Repository
public interface UserRepository extends JpaRepository<UserDemo, Long> {// postgre 原生sql语句查询。@Query(value = "select * from user_demo as a where  (a.address ->> 'province') = ?1", nativeQuery = true)List<UserDemo> findByAddress_Province(String value);@Query(value = "select * from user_demo as a where  (a.info ->> 'name') = ?1", nativeQuery = true)List<UserDemo> findByInfo_Name(String name);
}
View Code

  

  参考过的相关文档与博客:

  https://blog.csdn.net/carry1beyond/article/details/79568934

  

 

转载于:https://www.cnblogs.com/zhaohuaxishi/p/10120593.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RedisTemplate value序列化导致的问题

大家好&#xff0c;我是烤鸭&#xff1a; ​ 今天分享一个redisTemplate 使用时&#xff0c;value 序列化的问题。 1. 问题描述 其实我最开始遇到的问题是&#xff1a; stringRedisTemplate.opsForSet().isMember(key,value)一直返回false问题&#xff0c;下边博客给出了…

[css] 如何实现换肤功能?

[css] 如何实现换肤功能&#xff1f; css 换肤常见方案 是通过 less/sass/postcss 等css 预处理器&#xff0c;通过它们自身的变量用法&#xff0c;设置不同变量&#xff0c;生成不同的主题样式&#xff0c;但是这些样式都是会被打包成常量&#xff0c;我们只能在编译之前修改…

日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码

大家好&#xff0c;我是烤鸭&#xff1a; ​ 今天分享一个 saltstack 中文乱码 的问题。 问题说明 由于项目之前没有接入公司的发布系统&#xff0c;今天接入之后发现日志乱码&#xff0c;不仅如此&#xff0c;从nacos获取到的中文参数也是乱码。于是猜想是发布系统遗留了一…

redis出现过多command 慢查询slowlog出现command命令

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一个问题&#xff0c;一个关于redis slowlog&#xff0c;执行过多 command命令的问题。 问题来源 所有走redis 的接口tp99和平均耗时是原来的两倍不止&#xff0c;运维说redis 的qps也翻倍了。查了下slowlog&#xff0c;发现…

springcloud gateway 使用nacos 动态过滤器 记一次线上网关升级cpu升高的问题

大家好&#xff0c;我是烤鸭&#xff1a; ​ 网关升级&#xff0c;想使用 springcloud gateway nacos 动态过滤器配置(原来是硬编码的方式)&#xff0c;升级之后出了一些问题(cpu升高&#xff0c;ygc频繁)&#xff0c;记录一下。 关于 springcloud gateway 集成 nacos 可以看…

【1】生产者-消费者模型的三种实现方式

(手写生产者消费者模型&#xff0c;写BlockingQueue较简便 ) 1、背景 生产者生产数据到缓冲区中&#xff0c;消费者从缓冲区中取数据。 如果缓冲区已经满了&#xff0c;则生产者线程阻塞&#xff1b; 如果…

springboot mybatis-plus 配置 yml 、druid 配置 yml 、mybatis-plus 代码生成

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下 springboot mybatis-plus 和 druid 的yml 配置文件。 pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency…

实验吧Web-易-天网管理系统(php弱类型,==号)

打开网页&#xff0c;查看源码&#xff0c;看到 <!-- $test$_GET[username]; $testmd5($test); if($test0) --> 说明用户名需要加密之后为0。 对于PHP的号&#xff0c;在使用 运算符对两个字符串进行松散比较时&#xff0c;PHP会把类数值的字符串转换为数值进行比较&…

个人的博客搭建(持续更新)

最近的CSDN的博客阅读体验非常的糟糕&#xff0c;恰好自己也一直想搭建一个属于自己的网站&#xff0c;放下自己的技术心得情感体会&#xff0c;从零开始慢慢搭建项目磨练技术&#xff0c;以后也把自己新习得的技术放在里面增加自己的学习乐趣。 一&#xff0c;搭建基本的项目模…

用Java实现图片验证码功能

一、什么是图片验证码&#xff1f; 可以参考下面这张图&#xff1a; 我们在一些网站注册的时候&#xff0c;经常需要填写以上图片的信息。 1、图片生成实体类&#xff1a; 1 package com.hexianwei.graphic;2 3 import java.awt.Color;4 import java.awt.Font;5 import java.aw…

nacos配置刷新失败导致的cpu上升和频繁重启,nacos配置中心源码解析

大家好&#xff0c;我是烤鸭&#xff1a; nacos 版本 1.3.2&#xff0c;先说下结论&#xff0c;频繁重启的原因确实没有找到&#xff0c;跟nacos有关&#xff0c;日志没有保留多少&#xff0c;只能从源码找下头绪(出问题的版本 server用的是 nacos 1.1&#xff0c;nacos-client…

nova— 计算服务

一、nova介绍&#xff1a; Nova 是 OpenStack 最核心的服务&#xff0c;负责维护和管理云环境的计算资源。OpenStack 作为 IaaS 的云操作系统&#xff0c;虚拟机生命周期管理也就是通过 Nova 来实现的。用途与功能 :1) 实例生命周期管理2) 管理计算资源3) 网络和认证管理4)REST…

springcloud gateway 自定义 accesslog elk

大家好&#xff0c;我是烤鸭&#xff1a; ​ 最近用 springcloud gateway 时&#xff0c;想使用类似 logback-access的功能&#xff0c;用来做数据统计和图表绘制等等&#xff0c;发现没有类似的功能&#xff0c;只能自己开发了。 环境&#xff1a; <dependency><gr…

jenkins发布docker项目 harbor

大家好&#xff0c;我是烤鸭&#xff1a; ​ jenkins 部署k8s 项目还是比较流畅的&#xff0c;本身建立多流水线项目&#xff0c;在项目中添加jenkinsfile就好了&#xff0c;镜像需要额外的参数&#xff0c;还可以添加dokcerfile文件。由于我现在的问题是不能够修改原有的项…

saltstack部署java应用失败无日志——CICD 部署

大家好&#xff0c;我是烤鸭&#xff1a; ​   最近在搞公司的CICD&#xff0c;遇到各种问题。复盘总结一下。 CICD 架构 这篇文章写得很详细&#xff0c;可以看一下 https://linux.cn/article-9926-1.html 而这里只是结合现在的情况分析下&#xff1a; CI 持续集成&…

[css] 浏览器是怎样判断元素是否和某个CSS选择器匹配?

[css] 浏览器是怎样判断元素是否和某个CSS选择器匹配&#xff1f; 有选择器&#xff1a; div.ready #wrapper > .bg-red 先把所有元素 class 中有 bg-red 的元素拿出来组成一个集合&#xff0c;然后上一层&#xff0c;对每一个集合中的元素&#xff0c;如果元素的 parent i…

idea 插件开发 扫描sqlserver

大家好&#xff0c;我是烤鸭&#xff1a; 最近在搞sqlserver 升级 mysql/tidb&#xff0c;发现代码里的sql有很多地方需要改&#xff0c;想着能不能开发一个省点力。 官方的迁移指南&#xff1a; https://www.mysql.com/why-mysql/white-papers/sql-server-to-mysql-zh/ 方案…

VUE之文字跑马灯效果

1.效果演示 2.相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue-2.4.0.js"></script> </head> <body> <div id&…

PMP 错题记录

PMP 错题记录 大家好&#xff0c;我是烤鸭&#xff1a; 这次的PMP错题集本来想考前发&#xff0c;临时能看看&#xff0c;还是耽搁了&#xff0c;补发一下吧&#xff0c;不知道以后用不用的上&#xff0c;据说改版了&#xff0c;可能也用不上了。 变更题错题记录 9、一项…

nginx 配置 http/2(h2) 和 http 在同一端口的问题

nginx 配置 http/2(h2) 和 http 在同一端口的问题 大家好&#xff0c;我是烤鸭&#xff1a; ​ 这个完全是个采坑记录了。 场景说明 由于这边有个需求想加个支持 grpc 方式转发的域名。 正常的二级域名都是映射到80端口&#xff0c;所以也没想太多&#xff0c;按照这个…