项目地址: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

PostgreSQL 、springboot 、spring data jpa 集成相关推荐

  1. 基于SpringBoot+ Spring Data Jpa的后台管理系统【源码开源】

    昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...

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

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

  3. SpringBoot集成Spring Data JPA多数据源(二)

    目录 1.引入依赖 2.application.yml配置文件 3.AtomikosJtaPlatform 4.事务管理器JPAAtomikosTransactionConfig 5.主数据源配置 6 ...

  4. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  5. springboot jpa sql打印_SpringBoot集成Spring Data JPA以及读写分离

    相关代码:github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理 ...

  6. hibernate mysql 读写分离_SpringBoot集成Spring Data JPA及读写分离

    JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理Java应用中的关系数据.它包括以下几方面 ...

  7. 第九章SpringBoot整合Spring Data JPA

    目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...

  8. 【SpringBoot框架篇】11.Spring Data Jpa实战

    文章目录 1.简介 1.1.JPA 1.2.Spring Data Jpa 1.3.Hibernate 1.4.Jpa.Spring Data Jpa.Hibernate三者之间的关系 2.引入依赖 ...

  9. SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...

最新文章

  1. java for嵌套for循环语句_java中的for循环嵌套语句怎么执行?
  2. java编程笔记8 面向对象三 内部类
  3. [Security] Automatically adding CSRF tokens to ajax calls when using jQuery--转
  4. Eclipse Validating减少不必要的验证
  5. 分步表单如何实现 html_HTML表单入门的分步指南
  6. Flash 与数学:圆的切线(3)
  7. 计算机二进制和太极,八卦与二进制
  8. ScrollView嵌套GridView,自定义Gridview动态设置Item的高度,屏幕适配
  9. Android 上百实例源码分析以及开源分析
  10. 分类网络 resnet
  11. java爬取双色球所有中奖号码历史数据
  12. Cannot resolve method ‘create‘ in ‘String‘
  13. UE4大数据可视化教程(10)——设置背景音乐和播放MP3格式音乐
  14. Python学习日志--摆动吧!钟摆!
  15. Anaconda conda常用命令:从入门到精通
  16. 用matlab画同心圆,求同心圆的同心度
  17. 最新版表情包小程序源码无需服务器
  18. 三极管原理--我见过最通俗讲法
  19. android 全键盘手机排行榜,小巧又精悍 3大系统直板全键盘手机搜罗
  20. Windows中cmd命令界面执行sqlmap总是报错“missing a mandatory option(......)”

热门文章

  1. 什么是跨域?跨域如何解决
  2. [react] 类组件和函数式组件有什么区别?
  3. [react] 展示组件和容器组件有什么区别?
  4. [react] React怎么判断什么时候重新渲染组件呢
  5. [html] link标签的属性media有哪些值?都有什么作用?
  6. 前端学习(2889):如何短时间内实现v-for 模板编译21
  7. [vue] DOM渲染在哪个周期中就已经完成了?
  8. [vue] 你知道style加scoped属性的用途和原理吗?
  9. [css] 重置(初始化)css的作用是什么?
  10. 前端学习(2359):如何注册事件