gpt4 book ai didi

postgresql - 如何在 JPA 中使用 WHERE 子句注释唯一约束

转载 作者:行者123 更新时间:2023-11-29 11:25:17 25 4
gpt4 key购买 nike

我需要在 PostgreSQL 中使用这些唯一约束

CREATE UNIQUE INDEX favorites_3col_uni_idx
ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;

CREATE UNIQUE INDEX favorites_2col_uni_idx
ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;

我在JPA中注释的第一个:

@Table(uniqueConstraints= {
@UniqueConstraint(name="favorites_3col_uni_idx", columnNames = {"user_id", "menu_id", "recipe_id"})
})

但是,“可以在 JPA 中注释第二个唯一索引吗?”

谢谢。

最佳答案

您似乎想要创建 partial indexes (CREATE INDEX ... ON ... WHERE) 使用 JPA 约束定义。

这些都是 PostgreSQL 特有的,不是由 JPA 指定的。您将需要使用 native 语法来创建它们。我认为 JPA 不提供任何索引定义功能。

您不能为此目的使用唯一约束,因为唯一的部分索引不是唯一约束。在 PostgreSQL 中,不能使用 CONSTRAINT constraint_name UNIQUE(columns) 创建部分唯一索引。 PostgreSQL 为唯一约束创建唯一索引根本只是一个实现细节。

参见:

某些 JPA 提供程序提供特定于该 JPA 提供程序的扩展注释,这些注释添加了运行 native DDL 脚本、使用注释定义索引等功能。由于您没有提到您使用的是哪个 JPA 提供程序,我无法告诉您更多信息。这是 documentation for EclipseLink index DDL ;如果您使用的是 Hibernate、OpenJPA 或 EclipseLink 以外的东西,这 工作

JPA 标准解决方法是在启动期间通过查询 pg_catalog.pg_index 检查这些索引是否存在。如果找不到它们,请使用 EntityManager native 查询发送适当的 native SQL CREATE UNIQUE INDEX 命令。如果您使用的是 EJB3.1,则 @Startup @Singleton bean 可用于此类任务。请参阅 PostgreSQL 文档了解 pg_catalog.pg_index 的结构。要检查给定名称的索引是否存在,请运行:

SELECT EXISTS(
SELECT 1
FROM pg_index
WHERE indexrelid = 'public.indexname'::regclass
);

请注意,上面的查询不会验证它是否是您期望的索引,但您可以通过一些额外的检查来验证它。只需在创建索引后检查 pg_index 的内容,这样您就知道要测试什么。我不建议尝试检查 indpred 的任何特定值;只需确保它不为空即可。

关于postgresql - 如何在 JPA 中使用 WHERE 子句注释唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com