项目地址: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. 【Stream—6】BufferedStream相关知识分享

    一.简单介绍以下BufferedStream 在前几章的讲述中,我们已经能够掌握流的基本特性和特点,一般进行对流的处理时,系统肩负着IO所带来的开销,调用十分频繁,这时候就应该想个办法减少这种开销,而 ...

  2. OpenStack集成ceph

    openstack组件集成ceph OpenStack集成ceph详细过程可以查看ceph官方文档:ceph document OpenStack Queens版本,1台控制节点controller, ...

  3. (三)OpenStack---M版---双节点搭建---Keystone安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.创建keystone数据库 2.创建随机密码作为管理员令牌 3.安装openstack-ke ...

  4. 新闻实时分析系统 Spark2.X集群运行模式

    1.几种运行模式介绍 Spark几种运行模式: 1)Local 2)Standalone 3)Yarn 4)Mesos 下载IDEA并安装,可以百度一下免费文档. 2.spark Standalone ...

  5. windows下的nginx应用

    nginx(背景) nginx是一个高性能的HTTP服务器,以前我经常在linux系统中配置,主要做反向代理和负载均衡,最近根据业务需要,需要在window中配置反向和负载,下面就介绍一下nginx的 ...

  6. Net Framework 4个Timer(网络收集整理)

    在 Visual Studio .NET 和 .NET Framework 中有四种计时器控件: (前边三种转载自 http://blog.csdn.net/aptentity/article/det ...

  7. cookie、session、token的区别

    一.  cookie 1.什么是cookie? Cookie 技术产生源于 HTTP 协议在互联网上的急速发展.随着互联网时代的策马奔腾,带宽等限制不存在了,人们需要更复杂的互联网交互活动,就必须同服 ...

  8. 【Android - 自定义View】之View的draw过程解析

    draw(绘制)过程的作用是将View绘制到屏幕上面.View中有 draw() 方法和 onDraw() 方法,但onDraw()方法是空方法:ViewGroup中没有draw()方法,也没有onD ...

  9. Centos 6、7 禁止密码验证登陆

    Centos 6.7 禁止密码验证登陆 安全方面的考虑,秘钥对验证登陆相对密码验证要更安全 修改 /etc/ssh/sshd_config 配置文件 该配置文件中,只需要修改一个参数 Password ...

  10. 英语口语考试资料Family

    I Love my family   12 years  ago, I was born in a happy family, there was a gentle father, a beautif ...