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

增删查改都已经实现。

  重点部分:

    1.定义自己的方言。

    

 package com.zxl.postgrespringdemo.config.dialect;

 import org.hibernate.dialect.PostgreSQL94Dialect;
import org.hibernate.type.StringType; import java.sql.Types; public class JsonbPostgresDialect extends PostgreSQL94Dialect {
public JsonbPostgresDialect() {
super();
registerColumnType(Types.JAVA_OBJECT, "jsonb");
registerHibernateType(Types.ARRAY, StringType.class.getName());
} }

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

  

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

    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; @Override
public 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();
} }
} @Override
public 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;
} @Override
public 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;
} @Override
public 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);
} @Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return deepCopy(cached);
} @Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return deepCopy(original);
} @Override
public boolean isMutable() {
return true;
} @Override
public int hashCode(Object x) throws HibernateException {
if (x == null) {
return 0;
} return x.hashCode();
} @Override
public boolean equals(Object x, Object y) throws HibernateException {
return ObjectUtils.nullSafeEquals(x, y);
} @Override
public Class<?> returnedClass() {
return jsonClassType;
} @Override
public int[] sqlTypes() {
return new int[]{Types.JAVA_OBJECT};
} @Override
public void setParameterValues(Properties properties) {
final String clazz = (String) properties.get(CLASS);
if (clazz != null) {
jsonClassType = classLoaderService.classForName(clazz);
}
}
}

    4.demo实体类

 /**
* 用户demo类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "user_demo")
@TypeDefs({
@TypeDef(name = "infoType", typeClass = JsonbType.class, parameters = {
@Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.UserBaseInfo")
}),
@TypeDef(name = "addressType", typeClass = JsonbType.class, parameters = {
@Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.Address")
})
})
public class UserDemo { @Id
@GeneratedValue
private Long id; @Column(columnDefinition = "jsonb")
@Type(type = "addressType")
private Address address; @Column(columnDefinition = "jsonb")
@Type(type = "infoType")
private UserBaseInfo info;
}

    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);
}

  

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

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

  

PostgreSQL 、springboot 、spring data jpa 集成的更多相关文章

  1. SpringBoot系列之Spring Data Jpa集成教程

    SpringBoot系列之Spring Data Jpa集成教程 Spring Data Jpa是属于Spring Data的一个子项目,Spring data项目是一款集成了很多数据操作的项目,其下 ...

  2. Springboot spring data jpa 多数据源的配置01

    Springboot spring data jpa 多数据源的配置 (说明:这只是引入了多个数据源,他们各自管理各自的事务,并没有实现统一的事务控制) 例: user数据库   global 数据库 ...

  3. javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful

    一.介绍 1.springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间 ...

  4. springboot:spring data jpa介绍

    转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...

  5. spring data jpa 操作pipelinedb 的continuous view 与stream

    一. 由于pipelinedb是postgreSQL的扩展,因此相关依赖于配置都合集成postgreSQL是一样的. springboot + spring data jpa + postgreSQL ...

  6. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

  7. Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA

    大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...

  8. JPA、Hibernate、Spring data jpa之间的关系,以及和springboot的整合

    什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...

  9. 集成Spring Data JPA

    1.Spring Data JPA简介 Spring Data是一个用于简化数据访问,并支持云服务的开源框 使用完成Spring Data JPA对user表的CRUD操作. 2.步骤 1.创建工程勾 ...

随机推荐

  1. linux添加、删除、升级软件包 yum rpm dpkg

    1.红帽7主要采用yum和rpm SN command   1 rpm -qa --query  --all. 2 rpm -ql <package> 列出包中的文件 3 rpm -ivh ...

  2. Pashmak and Parmida's problem(树状数组)

    题目链接:http://codeforces.com/contest/459/problem/D 题意: 数列A, ai表示 i-th 的值, f(i,j, x) 表示[i,j]之间x的数目, 问:当 ...

  3. Tarjan-割点

    割点——tarjan #include <bits/stdc++.h> using namespace std; ; ; int n, m; int ans;//个数 * MAXM], n ...

  4. react-hook生命周期

    ① useEffect相当于componentDidMount和componentDidUpdate两个生命周期函数 ②useEffect是异步的 ========================== ...

  5. 音频工具kaldi部署及模型制作调研学习

    语音识别简介 语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR).计算机语音识别(英语:Comput ...

  6. wake on lan定时开机部署

    在Linux下通过Wake On LAN实现网络唤醒远程开机 我们经常有这样的场景或需求,人在外面,需要将家里的机器或公司的机器开启,进行远程控制操作. 有几种方式可以实现远程开机,一是通过主板的来电 ...

  7. 虚拟机配置net模式

    在cmd中输入ipconfig -all查看 更改网络适配器 进入虚拟机左上角编辑----虚拟机网络编辑器查看VMnet8,虚拟机会为我们分配的固定ip段:如下图: ip段是128---254,所以设 ...

  8. oracle 触发器(自增写法)

    触发器trigger 触发器我们也可以认为是存储过程,是一种特殊的存储过程. 存储过程:有输入参数和输出参数,定义之后需要调用 触发器:没有输入参数和输出参数,定义之后无需调用,在适当的时候会自动执行 ...

  9. cbv请求分析

    CBV源码分析 DRF中中所有视图都是基于CBV形式完成, 所以分析其cbv源码, 了解drf的基本请求流程就比较有必要了. urls.py """下面是一个通用的url ...

  10. SpringBoot写一个登陆注册功能,和期间走的坑

    文章目录 前言 1. 首先介绍项目的相关技术和工具: 2. 首先创建项目 3. 项目的结构 3.1实体类: 3.2 Mapper.xml 3.3 mapper.inteface 3.4 Service ...