- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在 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/
我是一名优秀的程序员,十分优秀!