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,一经查实,立即删除!

相关文章

[css] 有用过Flex吗?简要说下你对它的了解

[css] 有用过Flex吗&#xff1f;简要说下你对它的了解 给我感触最深的只有两点方便/好用子元素超出的bug关于bug, 大家有什么好的解决方案, 除了overflow: hidden个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大…

RedisTemplate value序列化导致的问题

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

41、OrthoMCL和mcl软件进行基因家族分析

转载&#xff1a;http://www.realbio.cn/news/124.html https://blog.csdn.net/seallama/article/details/43820763 http://www.cnblogs.com/huangying78/p/8638506.html 1. 数据库的配置 OrthoMCL的分析需要先行建立mysql账户并建立相应的数据库。关于mysql用户的创建我们不在…

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

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

beego——模板处理

beego的模板处理引擎采用的是Go内置的html/template包进行处理&#xff0c;而且beego的模板处理逻辑是采用了缓存编译方式&#xff0c; 也就是所有的模板会在beego应用启动的时候全部编译然后缓存在map里面。 1.模板目录 beego中默认的模板目录是views&#xff0c;用户可以把模…

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

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

[css] 列举CSS优化、提高性能的方法

[css] 列举CSS优化、提高性能的方法 加载性能压缩CSS通过link方式加载&#xff0c;而不是import复合属性其实分开写&#xff0c;执行效率更高&#xff0c;因为CSS最终也还是要去解析如 margin-left: left;选择器性能尽量少的使用嵌套&#xff0c;可以采用BEM的方式来解决命名冲…

[css] 假如设计稿使用了非标准的字体,你该如何去实现它?

[css] 假如设计稿使用了非标准的字体&#xff0c;你该如何去实现它&#xff1f; 协商解决, 如果是重要信息, 如logo等, 使用图片, iconfont.个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 …

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

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

[学习笔记]上下界网络流

有的时候&#xff0c;网络流建模要考虑某些边必须选择若干次&#xff0c;又不能多于若干次&#xff0c;而且不太容易转化成比较好的限制模型&#xff0c; 就简单粗暴地给每条边定一个流量的上下界&#xff0c;求在满足上下界的基础上的一些问题。 大概有以下几种。 基本思路都是…

[css] 你知道全屏滚动的原理是什么吗?它用到了CSS的哪些属性?

[css] 你知道全屏滚动的原理是什么吗&#xff1f;它用到了CSS的哪些属性&#xff1f; 全屏滚动和轮播图类似&#xff0c;都是通过改变元素位置或者显示与隐藏来实现&#xff0c;配合JS的一些交互距离判断&#xff0c;实现类似原生滚动捕获的效果。这里全屏的话就需要将宽高都设…

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

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

[css] 你是怎样抽离样式模块的?

[css] 你是怎样抽离样式模块的&#xff1f; 说的是 webpack extract-text-webpack-plugin插件吧&#xff1f; 把样式文件单独打包出来。 webpack4 升级了插件为 mini-css-extract-plugin个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c;…

【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…

[css] 说说你对媒体查询的理解

[css] 说说你对媒体查询的理解 当年做响应式布局的时候用过媒介查询&#xff0c;media query。包括现在有的时候为了兼容也会用到一些&#xff0c;查找对应范围使用不同的样式个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定…

Spring Boot 2.1 版本变化[翻译]

大家好&#xff0c;我是烤鸭&#xff1a; ​ 最近在把低版本的springboot项目升级&#xff0c;正好翻译了下springboot 2.1-2.3 版本的更新日志。 ​ Github 原文&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes ​ 2.2 版…

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

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

[css] 你知道的等高布局有多少种?写出来

[css] 你知道的等高布局有多少种&#xff1f;写出来 flex拉伸display: flex; align-items: stretch;padding margin抵消 然后background-clip默认是border-box所以会在被抵消的位置依然显示背景 造成等高假象.box,.box2{float: left;width: 100px; } .box {background: #cccccc…

Spring Boot 2.2版本变化[翻译]

大家好&#xff0c;我是烤鸭&#xff1a; ​ 最近在把低版本的springboot项目升级&#xff0c;正好翻译了下springboot 2.1-2.3 版本的更新日志。 ​ Github 原文&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes ​ 2.1 版…