如何对 Postgresql 数组进行 JPA 查询?

Ric*_*Bay 3 postgresql hibernate jpa spring-boot

如何使用 text[] 列查询 Postgresql 表的模型:

@TypeDefs({
    @TypeDef(
        name = "string-array", 
        typeClass = StringArrayType.class
    )
})

@Entity
@Table(name = "names")
public class Names implements Serializable
{  
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;
    
    @Column(name = "name", nullable = false)
    private String name;
    
    @Type(type = "string-array")
    @Column(name = "tags", columnDefinition = "text[]")
    private String[] tags;
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的 CrudRepository 查询,但验证失败:

@Query("SELECT t FROM Names t WHERE :tag MEMBER OF t.tags")
Iterable<Names> findByTag(@Param("tag") String tag);
Run Code Online (Sandbox Code Playgroud)

我可以找到有关如何插入、更新和删除 SQL 数组的示例和文档,但没有找到有关如何查询它们的信息。

小智 5

当我想查询数组类型(INTEGER[])列中是否包含特定参数值(INTEGER)时,我遇到了同样的问题。

... WHERE :type MEMBER OF (TABLENAME.typeArray)... => 验证失败并出现 NullPointerException

... WHERE :type ANY(TABLENAME.typeArray)... => 验证失败,因为“TABLENAME”是意外标记

...WHERE :type IN (TABLENAME.typeArray)... => 通过验证,但在执行过程中失败operator does not exist: integer = integer[]

最终对我有用的是Fabricio Colombo在对上述答案之一的评论中提出的解决方案 - 感谢他,我只是重新发布该解决方案以获得更好的可见性,因为在找到它之前我也挣扎了一段时间。

@Query(value = "SELECT * FROM TABLE WHERE :type = ANY(TABLE.ARRAY_COLUMN)", nativeQuery = true)    
Run Code Online (Sandbox Code Playgroud)