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提供程序提供特定于该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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |