【问题标题】:How convert java type to domain of postgres with hibernate(springData)?java - 如何使用hibernate(spring Data)将java类型转换为postgres的域?
【发布时间】:2020-11-02 02:12:40
【问题描述】:

我在 postgres 中创建了域:

create domain arrayofids as numeric[];

现在我想像这样在 spring 数据中使用域:

String fakeQuery = "unnest(CAST (:ids AS arrayofids))";
Query nativeQuery = entityManager.createNativeQuery(fakeQuery);
BigInteger[] arrayOfids = new BigInteger[] {new BigInteger("1"),new BigInteger("2)} //or It can be List. It is not important
nativeQuery.setParameter("ids", arrayOfids);
List resultList = nativeQuery.getResultList();

当然我得到错误:

org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to arrayofIds

在我使用 https://dalesbred.org/docs/api/org/dalesbred/datatype/SqlArray.html 之前,它运行良好,或者我自己在 JDBC 中进行了自定义类型。 Hibernate 不允许轻松使用我的域。

这样查询:

select * from mtTbale where id in :ids

不感兴趣。我应该使用带有 unnest 和 CAST 的域

【问题讨论】:

    标签: postgresql hibernate jpa spring-data nhibernate-mapping


    【解决方案1】:

    将 :ids 设为数字数组的文本表示形式,即“{1, 2}”并将 SELECT 添加到查询中。
    试试这个:

    String fakeQuery = "SELECT unnest(CAST (:ids AS arrayofids))";
    Query nativeQuery = entityManager.createNativeQuery(fakeQuery);
    String arrayOfids = "{" + 1 + ", " + 2 + "}"; // obtain the string as is relevant in your case
    nativeQuery.setParameter("ids", arrayOfids);
    List resultList = nativeQuery.getResultList();
    

    第二个查询应该是这样的:

    select * from mtTbale where id = ANY(CAST(:ids AS arrayofids));
    

    您也可以使用 Postgres 速记(并且更具可读性)强制转换语法。
    而不是CAST(:ids AS arrayofids) 使用:ids::arrayofids

    【讨论】:

    • 感谢您的回答。关于 Postgres 速记我不知道。谢谢。
    • 关于字符串。在我看来,将参数(java对象)转换为字符串并在查询参数中使用字符串对于生产来说不是一个好主意。如果没有更好的方法来实现我的目标,我可能会采纳你的建议)
    • 嗯,Java 对象和 Postgres 域是非常不同的动物。使用中间文本表示非常灵活,一点也不坏。
    • 我同意你的观点,它们是不同的。但是数组呢?我认为 BigInteger 数组和 numeric 数组应该差别不大,但我没有成功找到将 bigInteger[] 转换为 numeric[] 的简单方法
    • 问题在于,实际上您的数据库抽象层不是将 BigInteger[] 传输到 Postgres 而是 bytea(显然是 BigInteger[] 的二进制本机表示)。 Postgres 很容易将 bigint[] 转换为 numeric[]。看这个:select ('{1,2,3}'::bigint[])::numeric[];
    猜你喜欢
    • 2014-04-06
    • 2014-05-08
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多