项目地址: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. 使用ndk交叉编译android各平台版本的第三方库

    只要弄明白了ndk-bundle的目录结构,交叉编译的基本原理就可以自行编写脚本去编译了.从仓库拿下代码包后,一般在linux平台下编译当前平台使用的库,只要使用其自动配置脚本configure进行平 ...

  2. RabbitMQ的入门学习

    RabbitMq消息队列 参考:https://blog.csdn.net/hellozpc/article/details/81436980 什么是消息队列 MQ :message Queue ,实 ...

  3. MyISAM与InnoDB两者之间区别与选择

    一.MyISAM与InnoDB两者之间区别 1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法 ...

  4. 2019-10-9:渗透测试,基础学习,php文件上传,mysql基础

    header("Content-Type:text/html;charst="utf-8")设置头部信息,解决编码问题setcookie("loginStrin ...

  5. 2019-9-20:渗透测试,基础学习,笔记,metasploit的基础使用

    使用kali下metasploit生成木马,控制windows系统 kali基于debin的数字取证系统,上面集成了很多渗透测试工具,前身为bt r3(BrackTrack) Metasploit,是 ...

  6. 2019-9-18:渗透测试,基础学习,ubuntu搭建LNMP,phpmyadmin

    1,安装nginx:sudo apt-get install nginx 2,安装完成,输入,service nginx start开启服务,输入:netstat -ntulp |grep 80,确定 ...

  7. Linux -- 进程间通信之信号量

    基本概念简述 多个线程同时访问一个共享数据,很可能造成恶劣的后果:为了保证数据访问资源的正确性和安全性,需要对线程进行"同步" (Linux下所有的执行实体都称为任务(task), ...

  8. httpclient常规封装的方法

    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compr ...

  9. .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇

    .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇 本文作为初级篇,适合已经安装好.NET Core 环境以及 Gtk 环境,并具备了 C#开发基础知识,能跑一些简单的例子,希望更 ...

  10. 程序员的算法课(20)-常用的图算法:最小生成树(MST)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...