微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我需要在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中注释第二个唯一索引吗?

谢谢.

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

这些是相当Postgresql特定的,并没有由JPA指定.您将需要使用本机语法来创建它们.我不相信JPA提供索引定义的任何功能.

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

看到:

> Specifying an Index (Non-Unique Key) Using JPA
> JPA: defining an index column

一些JPA提供程序提供特定于该JPA提供程序的扩展注释,其添加用于运行本机DDL脚本的功能,定义具有annoations的索引等.由于您没有提到您正在使用哪个JPA提供程序,因此我无法告诉您更多信息.这是documentation for EclipseLink index DDL;如果您使用的是Hibernate,OpenJPA或EclipseLink之外的其他内容,则无法使用.

JPA标准解决方法是通过查询pg_catalog.pg_index来检查启动期间是否存在这些索引.如果找不到它们,请使用EntityManager本机查询发送相应的本机sql CREATE UNIQUE INDEX命令.如果您正在使用EJB3.1,则@Startup @Singleton bean对此类任务很有用.有关pg_catalog.pg_index的结构,请参阅Postgresql文档.要检查是否存在给定名称的索引,请运行:

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

请注意,上述查询无法验证它是您期望的索引,但您可以通过一些额外的检查来执行此操作.只需在创建索引后检查pg_index的内容,以便知道要测试的内容.我不建议尝试检查indpred的任何特定值;只是确保它不是null.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐