Hypersistence Utils PostgreSQL专属类型映射INET、HSTORE、RANGE和TS_VECTOR【免费下载链接】hypersistence-utilsThe Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get the most out of your data access layer.项目地址: https://gitcode.com/gh_mirrors/hy/hypersistence-utilsHypersistence Utils前身为Hibernate Types是一个强大的Spring和Hibernate工具库它提供了全面的PostgreSQL专属类型映射解决方案帮助开发者轻松处理INET、HSTORE、RANGE和TS_VECTOR等特殊数据类型优化数据访问层性能。为什么需要Hypersistence UtilsPostgreSQL提供了许多强大的专属数据类型如INET网络地址、HSTORE键值对、RANGE范围类型和TS_VECTOR全文搜索向量。然而标准JPA/Hibernate通常不直接支持这些类型导致开发者需要编写大量自定义代码来处理它们。Hypersistence Utils通过提供现成的类型映射消除了这一痛点让开发者能够专注于业务逻辑而非数据类型转换。PostgreSQL INET类型映射INET类型用于存储IPv4或IPv6地址。Hypersistence Utils提供了PostgreSQLInetType来无缝映射Java的Inet对象与PostgreSQL的INET类型。核心实现public class PostgreSQLInetType extends ImmutableTypeInet { Override public Inet get(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { String ip rs.getString(position); return (ip ! null) ? new Inet(ip) : null; } Override public void set(PreparedStatement st, Inet value, int index, SharedSessionContractImplementor session) throws SQLException { if (value null) { st.setNull(index, Types.OTHER); } else { Object holder ReflectionUtils.newInstance(org.postgresql.util.PGobject); ReflectionUtils.invokeSetter(holder, type, inet); ReflectionUtils.invokeSetter(holder, value, value.getAddress()); st.setObject(index, holder); } } }使用方法在实体类中使用Type注解指定INET类型Entity public class NetworkDevice { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String name; Type(type io.hypersistence.utils.hibernate.type.basic.PostgreSQLInetType) private Inet ipAddress; // Getters and setters }PostgreSQL HSTORE类型映射HSTORE是PostgreSQL的键值对存储类型非常适合存储半结构化数据。Hypersistence Utils的PostgreSQLHStoreType允许将Java的Map对象直接映射到HSTORE列。核心实现public class PostgreSQLHStoreType extends ImmutableTypeMap { Override protected Map get(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { return (Map) rs.getObject(position); } Override protected void set(PreparedStatement st, Map value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value); } }使用方法Entity public class Product { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String name; Type(type io.hypersistence.utils.hibernate.type.basic.PostgreSQLHStoreType) private MapString, String attributes; // Getters and setters }PostgreSQL RANGE类型映射RANGE类型允许存储连续范围的值如日期范围、数字范围等。Hypersistence Utils的PostgreSQLRangeType支持多种范围类型包括int4range、int8range、numrange、tsrange、tstzrange和daterange。核心实现public class PostgreSQLRangeType extends ImmutableTypeRange implements DynamicParameterizedType { Override protected Range get(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { Object pgObject rs.getObject(position); if (pgObject null) { return null; } String type ReflectionUtils.invokeGetter(pgObject, type); String value ReflectionUtils.invokeGetter(pgObject, value); switch (type) { case int4range: return Range.integerRange(value); case int8range: return Range.longRange(value); case numrange: return Range.bigDecimalRange(value); case tsrange: return Range.localDateTimeRange(value); case tstzrange: return Range.zonedDateTimeRange(value); case daterange: return Range.localDateRange(value); default: throw new HibernateException(new IllegalStateException(The range type [ type ] is not supported!)); } } }使用方法Entity public class Reservation { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String guestName; Type(type io.hypersistence.utils.hibernate.type.range.PostgreSQLRangeType) Column(columnDefinition daterange) private RangeLocalDate dateRange; // Getters and setters }PostgreSQL TS_VECTOR类型映射TS_VECTOR类型用于存储全文搜索的预处理文档支持高效的文本搜索。Hypersistence Utils的PostgreSQLTSVectorType简化了TS_VECTOR类型的映射。核心实现public class PostgreSQLTSVectorType extends MutableDynamicParameterizedTypeObject, PostgreSQLTSVectorSqlTypeDescriptor, PostgreSQLTSVectorTypeDescriptor { public PostgreSQLTSVectorType() { super( Object.class, PostgreSQLTSVectorSqlTypeDescriptor.INSTANCE, new PostgreSQLTSVectorTypeDescriptor() ); } public String getName() { return tsvector; } }使用方法Entity public class Article { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String title; Column(columnDefinition text) private String content; Type(type io.hypersistence.utils.hibernate.type.search.PostgreSQLTSVectorType) Column(columnDefinition tsvector) private String searchVector; // Getters and setters }如何开始使用要在项目中使用Hypersistence Utils的PostgreSQL类型映射只需添加相应的依赖并配置Hibernate类型。具体步骤如下添加依赖在pom.xml中添加Hypersistence Utils依赖根据Hibernate版本选择合适的模块dependency groupIdio.hypersistence/groupId artifactIdhypersistence-utils-hibernate-73/artifactId version3.6.1/version /dependency配置Hibernate在Hibernate配置中注册自定义类型configuration.registerTypeOverride(PostgreSQLInetType.INSTANCE); configuration.registerTypeOverride(PostgreSQLHStoreType.INSTANCE); configuration.registerTypeOverride(PostgreSQLRangeType.INSTANCE); configuration.registerTypeOverride(PostgreSQLTSVectorType.INSTANCE);在实体类中使用如上述示例所示在实体类属性上使用Type注解指定相应的PostgreSQL类型。总结Hypersistence Utils为PostgreSQL的特殊数据类型提供了简洁而强大的映射解决方案使开发者能够充分利用PostgreSQL的高级特性同时保持JPA/Hibernate的编程模型。通过使用PostgreSQLInetType、PostgreSQLHStoreType、PostgreSQLRangeType和PostgreSQLTSVectorType开发者可以轻松处理网络地址、键值对、范围值和全文搜索向量极大地简化了数据访问层的实现。无论是构建新应用还是迁移现有项目Hypersistence Utils都是处理PostgreSQL专属类型的理想选择它不仅提高了开发效率还确保了代码的可维护性和性能优化。要开始使用Hypersistence Utils只需克隆仓库并按照文档进行配置git clone https://gitcode.com/gh_mirrors/hy/hypersistence-utils探索更多高级功能和示例请查阅项目源码中的测试用例如PostgreSQLHStoreTypeTest.javaPostgreSQLRangeTypeTest.javaPostgreSQLTSVectorTypeTest.java【免费下载链接】hypersistence-utilsThe Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get the most out of your data access layer.项目地址: https://gitcode.com/gh_mirrors/hy/hypersistence-utils创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考