加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:06:21 所属栏目:百科 来源:网络整理
导读:我需要在PostgreSQL中使用这些独特的约束 CREATE UNIQUE INDEX favorites_3col_uni_idxON favorites (user_id,menu_id,recipe_id)WHERE menu_id IS NOT NULL;CREATE UNIQUE INDEX favorites_2col_uni_idxON favorites (user_id,recipe_id)WHERE menu_id IS N
我需要在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读