What JPA + Hibernate data type should I use to support the vector extension in a PostgreSQL database, so that it allows me to create embeddings using a JPA Entity?
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
What JPA + Hibernate data type should I use to support the vector extension in a PostgreSQL database, so that it allows me to create embeddings using a JPA Entity?
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
Since 6.4 I think, Hibernate has released a vector module : https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#vector-module
You import the hibernate-vector lib (you won't need converter anymore) and then this should work :
@Column( name = "the_vector" )
@JdbcTypeCode(SqlTypes.VECTOR)
@Array(length = 3)
private float[] theVector;
(maybe https://stackoverflow.com/a/78212559/4499463 should be closed as duplicated?)
There are slightly different ways to handle this in Hibernate 6 vs Hibernate 5. This is how you should handle this in Hibernate 6, since there is already an answer for Hibernate 5.
You need to use a dependency from io.hypersistence
. Check what version of Hibernate you use, since each version has different artifacts. For Hibernate ORM 6.2
:
<!-- https://mvnrepository.com/artifact/io.hypersistence/hypersistence-utils-hibernate-62 -->
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.5.3</version>
</dependency>
For the Entity mapping (TypeDef has been removed in v.6):
import jakarta.persistence.*;
import org.hibernate.annotations.Type;
import io.hypersistence.utils.hibernate.type.json.JsonType;
import java.util.List;
import java.util.UUID;
@Entity
@Table(name = "items")
public class Item {
@Id
@Column(name = "id")
private UUID id;
@Basic
@Type(JsonType.class)
@Column(name = "embedding", columnDefinition = "vector")
private List<Double> embedding;
...
}
JPA Repository Query:
@Repository
public interface ItemRepository extends JpaRepository<Item, UUID> {
@Query(nativeQuery = true,
value = "SELECT * FROM items ORDER BY embedding <-> cast(? as vector) LIMIT 3")
List<Item> findNearestNeighbors(String embedding);
}
You can use vladmihalcea Hibernate types to convert a vector type to List<Double>, so it is possible to save or query with JpaRepository.
Add a dependency to the pom.xml file:
Create the Item class:
Create a JpaRepository interface that supports save and find. You can write custom findNearestNeighbors methods with native SQL
Test create, query and findNearestNeighbors: