首页 > 数据库 >JPA使用pg数据库时,bool字段不能跨库迁移的解决方案

JPA使用pg数据库时,bool字段不能跨库迁移的解决方案

时间:2024-05-13 08:59:53浏览次数:28  
标签:hibernate return JPA 跨库 value bool import type class

首先,大多数人的印象里,hibernate作为一个笨重学习成本高的近乎全自动的框架它的优点就是可以支持很多数据库,但是最近研究发现,java中的boolean类型的字段,在mariadb/mysql 中为bit 0/1,在sqlserver/oracle中为bit 0/1 numeric(1,0) check * in (0,1),然而在PG数据库中却是bool,因为pg就是支持boolean到bool的映射

所以,java中的boolean 在除PG的数据库之外的几个常见数据库中存储的都是 0/1,这就导致了数据迁移时会出现不兼容的问题。

在GPT的帮助下,经研究hibernate的数据库方言发现,可以通过修改官方的方言以达到实现兼容的目的。

相关代码如下:

 1 package com.example.demo.jpa.dialect;
 2 
 3 import java.sql.Types;
 4 
 5 import org.hibernate.boot.model.TypeContributions;
 6 import org.hibernate.dialect.PostgreSQLDialect;
 7 import org.hibernate.service.ServiceRegistry;
 8 import org.hibernate.type.descriptor.sql.internal.DdlTypeImpl;
 9 import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
10 
11 /***
12  * 将java中的bool 处理成pg中的numeric(1,0)
13  * 
14  *
15  */
16 public class PgDialect extends PostgreSQLDialect {
17 
18     @Override
19     public int getPreferredSqlTypeCodeForBoolean() {
20         return Types.NUMERIC;
21     }
22 
23     @Override
24     public String toBooleanValueString(boolean bool) {
25         // 将布尔值映射为 numeric(1, 0)
26         return bool ? "1" : "0";
27     }
28 
29     @Override
30     public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
31         super.contributeTypes(typeContributions, serviceRegistry);
32         // 把java中的Boolean转为0/1 把数据库中的0/1 转为Boolean
33         typeContributions.getTypeConfiguration().getJavaTypeRegistry().addDescriptor(new PgBooleanJavaType());
34         final DdlTypeRegistry ddlTypeRegistry = typeContributions.getTypeConfiguration().getDdlTypeRegistry();
35         ddlTypeRegistry.addDescriptor(new DdlTypeImpl(Types.BOOLEAN, "numeric(1,0) ", this));
36     }
37 
38 }

 

 1 package com.example.demo.jpa.dialect;
 2 
 3 import java.math.BigDecimal;
 4 import java.util.Objects;
 5 
 6 import org.hibernate.type.descriptor.WrapperOptions;
 7 import org.hibernate.type.descriptor.java.BooleanJavaType;
 8 
 9 /**
10  * 当从数据库的字段类型为Boolean时,如何与java中的boolean互相映射
11  *
12  */
13 public class PgBooleanJavaType extends BooleanJavaType {
14 
15     private static final long serialVersionUID = 1L;
16 
17     @SuppressWarnings("unchecked")
18     @Override
19     public <X> X unwrap(Boolean value, Class<X> type, WrapperOptions options) {
20         if (value == null) {
21             return null;
22         } else if (BigDecimal.class.isAssignableFrom(type)) {
23             return (X) (Objects.equals(true, value) ? new BigDecimal(1) : new BigDecimal(0));
24         } else if (Boolean.class.equals(type)) {
25             return (X) value;
26         } else if (Byte.class.equals(type)) {
27             return (X) toByte(value);
28         }
29         if (Short.class.equals(type)) {
30             return (X) toShort(value);
31         } else if (Integer.class.equals(type)) {
32             return (X) toInteger(value);
33         } else if (Long.class.equals(type)) {
34             return (X) toLong(value);
35         } else if (Character.class.equals(type)) {
36             return (X) Character.valueOf(value ? '1' : '0');
37         } else if (String.class.equals(type)) {
38             return (X) (value ? "1" : "0");
39         }
40         throw unknownUnwrap(type);
41     }
42 
43 }

 

标签:hibernate,return,JPA,跨库,value,bool,import,type,class
From: https://www.cnblogs.com/swtjavaspace/p/18188556

相关文章

  • 带你了解GaussDB SQL中的BOOLEAN表达式
    本文分享自华为云社区《GaussDBSQL基础语法示例-BOOLEAN表达式》,作者:Gauss松鼠会小助手2。一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持的SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》为主线进行介绍。二、Gauss......
  • SpringBoot Jpa多条件查询
    RepositoryMyRepositoryextendsJpaRepository<MyEntity,Integer>精确查询:Example包装EntityPageablepageable=PageRequest.of(current-1,pageSize);//myEntity实体类参数Exampleexample=Example.of(myEntity);Page<MyEntity>page=myRepository.fin......
  • JPA Example 默认 join
    起因:由于同事增加了一个对象关联。并且采用了Example查询,导致了一个Null的问题。 主表:BoBookingorder关联表:BoJobcontainerinfo 一关联如下:@Entity@Table(name="bo_bookingorder",catalog="kintech_bo")publicclassBoBookingorder{privateStringbooki......
  • JPA使用问题总结记录
    1.jpa使用@OneToMany和@ManyToOne注解映射两个实体类的关系时报栈溢出的错误:>实体代码片段:①主表(一)@OneToMany(fetch=FetchType.EAGER,mappedBy="crewManagement",cascade=CascadeType.REMOVE)privateList<CrewMember>crewMemberList;②关联表(多)@ManyToOne@......
  • Spring Boot JPA
    SpringBootJPA是一个基于SpringBoot框架的Java持久层框架,它是JavaPersistenceAPI(JPA)的一个实现。JPA是Java平台上的一种ORM(对象关系映射)规范,它提供了一种简单、统一的方式来管理应用程序中的对象和关系型数据库之间的映射。SpringBootJPA基于Hibernate实现了......
  • SQL server跨库链接服务器
    SQLserver进阶技能篇:SQL的跨库查询与链接服务器-知乎(zhihu.com)各位小伙伴们,关于MSSQL的基本技能篇前面一共写了10篇,也基本上算是告一段落,接下来将开始介绍进阶技能篇。在构思这个进阶技能篇的时候,一直在考虑先写哪个,其实到看到这部分内容能理解的人,基本上对SQL数据库知识已......
  • MySQL里 没有 boolean类型 怎么办?MySQL 里的 tinyint(1)
    之前我写的博客:https://www.cnblogs.com/del88/p/12538470.html由于之前的博客,没有使用markdown懒得重新排版了,重新写一篇;直接看AI给的答案吧:MySQL里没有boolean类型怎么办?在MySQL中,确实没有专门的boolean数据类型。不过,MySQL通常使用TINYINT(1)作为布尔值的替代。当使用T......
  • 记录SpringBoot里JPA配置多数据源
    之前的系统是建立在mysql数据库上的,后来需求变更,需要跟教务系统对接获取教师的课表数据,在Oracle上。baidu了之后找了几篇样例,写完了。发现只能连接@Primary的数据源。思索3天后,觉得应该是系统启动时自动就将Primary的数据源加载好了,并没有根据我的bean和mapper去匹配对应的数据......
  • 通过JPA注解获取某个类主键字段
    123456789101112131415161718public StringgetPkColumn(StringclassName){    StringpkColumn= null;    try {        Classclazz=Class.forName(className);        Field[]fields=clazz.getDeclaredFiel......
  • Spring Data JPA应用之自定义Repository实现
    在SpringBoot对SpringDataJPA的支持中可以观察到对于数据访问并没有复杂的业务逻辑,可以知道SpringDataJPA提供了代理模式进行处理。跟踪源码可以知道其使用了SimpleJapRepository。那么这个类的有什么特点呢?通......