【发布时间】:2020-12-16 13:08:23
【问题描述】:
如何使用 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;
...
}
这是我尝试的 CrudRepository 查询,但验证失败:
@Query("SELECT t FROM Names t WHERE :tag MEMBER OF t.tags")
Iterable<Names> findByTag(@Param("tag") String tag);
我可以找到有关如何插入、更新和删除 SQL 数组的示例和文档,但找不到有关如何查询它们的示例和文档。
【问题讨论】:
-
很遗憾没有。映射工作正常,查询返回数据。问题是在数组中搜索。我猜 MEMBER OF 要求该属性是一个集合。希望 Vlad Mihalcea 出现并用简短的语言向我解释 :)
-
总有编写原生查询的选项,不受 jpql 等限制。
-
是的,原生查询是我的后备。还不错,因为几乎只有 Postgresql 支持 SQL 数组。
-
根据这篇博文,这是行不通的。引用 Vlad 评论:“JPQL 不支持存储多个属性的基本类型。因此,您应该改用 SQL。”。 How to map a PostgreSQL ARRAY to a Java List with JPA and Hibernate 尝试使用原生查询:
@Query(value = "SELECT * FROM Names t WHERE :tag = ANY(t.tags)", nativeQuery = true)
标签: postgresql spring-boot hibernate jpa