首页 > 其他分享 >jpa中枚举类型保存和查询

jpa中枚举类型保存和查询

时间:2023-07-24 15:56:42浏览次数:34  
标签:status containerJavaType jpa propertyName 查询 枚举 final

1,存储枚举字段时,保存在数据库中的值
默认情况使用枚举类型的ordinal值,该值是枚举值定义顺序,从0,1,2。。。依次类推

@Enumerated(EnumType.ORDINAL)
private SignUpStatus status;

使用枚举值名称

@Enumerated(EnumType.STRING)
private SignUpStatus status;

2,使用native sql查询枚举类型字段时,返回值封装问题
jpa框架对于返回结果封装,简单使用是美好的,但实际情况都是复杂难以预料的,对于不了解细节的人来说,总会遇到莫名奇妙的问题。
在jpa中用hql查询时,不用再调用以下方法

dataQuery.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(getClazz()));

因为hql对象查询是严格关联的,其查询后结果自动被封装为对应的bean,再次调用封装类型是多余的。并且hql查询的列不在实体中时,在初次查询结果中是存在的,但由于hql执行框架第一次只封装的与实体对应的列(严格对应),而实体不存在的对应的列结果丢失,导致即便调用上面的代码也取不到结果。相当于将默认转换的bean(不含不在实体中的列)再次转换。
hql查询的好处就是,不用写sql,不用在意字段列名的对应,可以减少写sql带来的错误;对象自动封装,封装时能处理常见类型,缺点就是复杂查询难以使用。

在jpa中使用native sql查询时,可以解决hql难以完成的一些查询问题,可以使用上面的代码对查询的直接结果直接封装(包括得到不在实体上的列结果)。缺点是封装为bean时不能友好的处理枚举类型,包装类型等类型的字段。也没有提供比较容易、有效的可以自行处理类型的接口。
解决这个问题修改源码+在类中实现多态,将修改后的代码按源码所在包名,放到项目src/main/java下即可(查看jdk ClassLoader如何加载相同报名类名的?)。
例如:
spring boot jpa 2.52版本 PropertyAccessBasicImpl


以下是PropertyAccessBasicImpl源码作用是获得bean字段get、set方法对象,修改为将枚举类,Long型包装类默认setter方法改为指定的多态方法,然后再相应类中实现对方法,完成结果转换

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.property.access.internal;

import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.property.access.spi.*;
import org.jboss.logging.Logger;

import java.lang.reflect.Method;
import java.math.BigInteger;

/**
 * PropertyAccessor for accessing the wrapped property via get/set pair, which may be nonpublic.
 *
 * @author Steve Ebersole
 *
 * @see PropertyAccessStrategyBasicImpl
 */
public class PropertyAccessBasicImpl implements PropertyAccess {
    private static final Logger log = Logger.getLogger( PropertyAccessBasicImpl.class );

    private final PropertyAccessStrategyBasicImpl strategy;
    private final GetterMethodImpl getter;
    private final SetterMethodImpl setter;

    public PropertyAccessBasicImpl(
            PropertyAccessStrategyBasicImpl strategy,
            Class containerJavaType,
            final String propertyName) {
        this.strategy = strategy;

        final Method getterMethod = ReflectHelper.findGetterMethod( containerJavaType, propertyName );
        this.getter = new GetterMethodImpl( containerJavaType, propertyName, getterMethod );
        if(getterMethod.getReturnType().isEnum()){
            final Method setterMethod = ReflectHelper.findSetterMethod( containerJavaType, propertyName, String.class );
            this.setter = new SetterMethodImpl( containerJavaType, propertyName, setterMethod );
        }else if(getterMethod.getReturnType().isAssignableFrom(Long.class)){
            final Method setterMethod = ReflectHelper.findSetterMethod( containerJavaType, propertyName, BigInteger.class );
            this.setter = new SetterMethodImpl( containerJavaType, propertyName, setterMethod );
        }else{
            final Method setterMethod = ReflectHelper.findSetterMethod( containerJavaType, propertyName, getterMethod.getReturnType() );
            this.setter = new SetterMethodImpl( containerJavaType, propertyName, setterMethod );
        }

    }

    @Override
    public PropertyAccessStrategy getPropertyAccessStrategy() {
        return strategy;
    }

    @Override
    public Getter getGetter() {
        return getter;
    }

    @Override
    public Setter getSetter() {
        return setter;
    }
}

 


类中status字段的两个set方法

public void setStatus(SignUpStatus status) {
    this.status = status;
}
public void setStatus(String status) {

    this.status = SignUpStatus.getByOriginal(status);
}

 





标签:status,containerJavaType,jpa,propertyName,查询,枚举,final
From: https://www.cnblogs.com/dagongjie/p/17577416.html

相关文章

  • 怎么查询mysql数据库重启记录
    项目方案:查询MySQL数据库重启记录1.简介MySQL是一种常见的关系型数据库管理系统,它在运行过程中可能会出现各种问题,包括数据库重启。在开发和维护过程中,我们经常需要查询数据库重启的记录,以便进行故障排查和性能优化等工作。本项目方案将介绍如何查询MySQL数据库的重启记录,包括......
  • 怎样优雅地增删查改(九):按日期范围查询
    目录实现按开始日期查询按结束日期查询使用项目地址 使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。实现定义按创建日期范围查询(IDateSpanOriente......
  • android 查询文件夹里面文件名
    Android查询文件夹里面文件名作为一名经验丰富的开发者,我很高兴能够教会你如何在Android中查询文件夹里的文件名。下面我将向你展示整个流程,并给出每一步的具体代码和注释。流程概述首先,让我们来看一下整个过程的流程概述。我们将通过以下步骤实现查询文件夹内文件名的功能:......
  • CSS3媒体查询
    什么是媒体查询?媒体查询(MediaQuery)是CSS3新语法。使用@media查询,可以针对不同的媒体类型定义不同的样式@media可以针对不同的屏幕尺寸设置不同的样式当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面目前针对很多苹果手机、Android手机,平板等设备......
  • sql server 查询表大小
    SQLServer查询表大小的步骤在SQLServer中,查询表大小可以帮助我们了解数据库中各个表的大小,从而优化数据库性能和存储空间。下面是查询表大小的步骤,以及每一步需要做的事情和相应的代码。步骤一:连接到SQLServer数据库首先,我们需要连接到SQLServer数据库。可以使用SQLServer......
  • sql server 查询本月日期
    SQLServer查询本月日期在SQLServer中,要查询本月的日期,可以通过以下步骤实现:步骤描述1获取当前日期2提取当前年份3提取当前月份4构建查询条件5执行查询1.获取当前日期首先,我们需要获取当前日期。可以使用GETDATE()函数来获取当前日期和时间。......
  • 查询mysql 某个表下一个自增id
    查询MySQL某个表下一个自增ID作为一名经验丰富的开发者,你经常需要与数据库打交道。在MySQL中,自增ID是一种常见的使用方式,用于唯一标识每一条记录。当你需要查询某个表的下一个自增ID时,可以按照以下步骤进行操作。步骤概览下面是整个查询MySQL某个表下一个自增ID的流程概览:步......
  • 查询mysql 安装版本,mac
    查询MySQL安装版本在Mac上使用MySQL时,有时候我们需要查看MySQL的安装版本信息。本文将介绍如何通过命令行和MySQL客户端来查询MySQL的安装版本。通过命令行查询MySQL安装版本在终端中执行以下命令可以查询MySQL的安装版本:mysql--version这个命令会返回MySQL的版本信息,例如:m......
  • 查询docker的操作记录
    查询Docker的操作记录作为一名经验丰富的开发者,我将指导你如何查询Docker的操作记录。在这个过程中,我将提供步骤和相应的代码示例,以帮助你更好地理解。步骤概览以下是查询Docker的操作记录的步骤概览:步骤描述1安装Docker2配置Docker日志驱动3重启Docker守护......
  • 查询MySQL公式字段重命名
    查询MySQL公式字段重命名作为一名经验丰富的开发者,你需要教会一位刚入行的小白如何实现“查询MySQL公式字段重命名”。下面将详细介绍整个流程,包括每一步需要做什么以及需要使用的代码及其注释。流程图下表展示了查询MySQL公式字段重命名的流程。步骤动作代码1连接......