【问题标题】:How to annotate unique constraint with WHERE clause in JPA如何在 JPA 中使用 WHERE 子句注释唯一约束
【发布时间】:2012-08-15 02:03:32
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: postgresql jpa unique-constraint


    【解决方案1】:

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

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

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

    见:

    一些 JPA 提供程序提供特定于该 JPA 提供程序的扩展注释,这些注释添加了用于运行本机 DDL 脚本、使用注释定义索引等功能。由于您没有提到您正在使用哪个 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 的任何特定值;只要确保它不为空即可。

    【讨论】:

    • 太棒了!感谢您的广泛解释,我将阅读此内容并尝试以编程方式进行。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多