代码之家  ›  专栏  ›  技术社区  ›  Mehdi Bouzidi

@使用Postgresql枚举的枚举映射

  •  0
  • Mehdi Bouzidi  · 技术社区  · 6 年前

    我创建了一个 entity 打电话 Agent 具有枚举 category . 我已经知道了 JPA 不会映射此 enum 具有 Postgresql 类型 枚举 所以我试着 武力 此映射。

    我拥有的:

    Java部件: 在java部分中,我们定义了 Person.java 实体和 类别 枚举类。

    人Java语言

    @Entity
    public class Agentimplements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
    
        @Column(length = 50, nullable = false)
        private String code;
        @Column(length = 50, nullable = false)
        private String first_name;
        @Column(length = 50, nullable = false)
        private String family_name;
    
        @Enumerated(EnumType.STRING)
        @Column(nullable = false)
        private TypeEntree category;
    
    }
    

    类别。Java语言

    public enum CategoryEn{
        CUSTOMER,
        PROVIDER,
        DRIVER
    }
    

    Sql强制:

    CREATE TYPE category_enum AS ENUM ('CUSTOMER','PROVIDER','DRIVER');
    
    CREATE FUNCTION dummy_cast(varchar) RETURNS category_enum AS $$
    SELECT CASE $1
        WHEN 'CUSTOMER' THEN 'CUSTOMER'::category_enum
        WHEN 'PROVIDER' THEN 'PROVIDER'::category_enum
        WHEN 'DRIVER' THEN 'DRIVER'::category_enum
    END;
    $$ LANGUAGE SQL;
    
    CREATE CAST (varchar AS category_enum) WITH FUNCTION dummy_cast(varchar) AS ASSIGNMENT;
    
    ALTER TABLE public.agent
    ALTER COLUMN category
    SET DATA TYPE category_enum
    USING agent::text::category_enum;
    

    在这里之前,一切都很好,但当我尝试执行这个 query 在中 AgentFacade :

     String jpql ="SELECT a FROM Agent a"
                    + " WHERE a.category = :cat";
            Query query = em.createQuery(jpql);
            query.setParameter("cat", CategoryEn.DRIVER);
    

    我有以下错误:

    原因: :javax。坚持不懈PersistenceException:异常[EclipseLink-4002] (Eclipse持久性服务-2.5.2.v20140319-9ad6abd): 组织。日食坚持不懈例外情况。DatabaseException内部 例外:组织。postgresql。util。PSQLException:ERREUR:运算符不存在:category\u enum=字符变化

    指示 :没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换


    我的问题是:

    1. 为什么我会有这个错误?
    2. 我可以解决这个错误吗?怎样
    3. 为什么 JPA公司 没有自动映射Java的工具 枚举 到Sql type enum ?

    附言 :我已经看到了几乎所有与此主题类似的stackoverflow问题/答案

    1 回复  |  直到 6 年前
        1
  •  1
  •   Łukasz Kamiński    6 年前

    出现此错误是因为驱动程序/ORM可能将该参数强制转换为varchar。

    您可以为该比较创建运算符:

    CREATE OR REPLACE FUNCTION texteq(
        category_enum,
        text)
      RETURNS boolean AS $q$ SELECT texteq($1::text, $2) $q$
      LANGUAGE SQL IMMUTABLE STRICT
      COST 1;
    
    CREATE OPERATOR =(
      PROCEDURE = texteq,
      LEFTARG = category_enum,
      RIGHTARG = text,
      COMMUTATOR = =,
      NEGATOR = <>,
      RESTRICT = eqsel,
      JOIN = eqjoinsel,
      HASHES,
      MERGES);
    

    我没有测试它是否在加入合并/哈希中有效,但简单的比较看起来很好。