【问题标题】:How to make criteria with array field in Hibernate如何在 Hibernate 中使用数组字段创建条件
【发布时间】:2016-07-27 15:47:04
【问题描述】:

我正在使用HibernatePostgres 并定义了character(1)[] 列类型。

所以我不知道如何让这个criteria 在数组中找到一个值。

喜欢这个查询

SELECT * FROM cpfbloqueado WHERE bloqueados @> ARRAY['V']::character[]

【问题讨论】:

  • 如果你看最后一个答案,那是我的。
  • 能把你试过的源码放上来吗?
  • 我没有代码,因为我只知道如何用 sql 制作代码

标签: sql hibernate postgresql criteria


【解决方案1】:

我不熟悉Postgres 及其类型,但您可以使用custom basic type mapping 定义自己的类型。这可以简化查询。

这里有很多关于 Postres 数组类型和 Hibernate 的线程,例如,this one。另一个可能有用的数组映射示例is here。最后,here is an example 使用 Criteria with user type。

代码示例可以是

   List result = session.createCriteria(Cpfbloqueado.class)
   .setProjection(Projections.projectionList()
      .add(Projections.property("characterColumn.attribute"), PostgresCharArrayType.class)
   )
   .setResultTransformer(Transformer.aliasToBean(Cpfbloqueado.class))
   .add(...) // add where restrictions here 
   .list()

另外,如果它对实现不重要,你可以在实体模型中定义最大长度,用@Column(length = 1)注释你的字段。

或者,如果您需要存储长度为1 的字符数组,则可以使用collection type


我希望我的观点是正确的,但是,如果能更好地描述问题域,那就太好了。

【讨论】:

  • 正如我在主题中所说,我想在数组中找到一个值,作为IN子句,想象一下,如果a我有一个数组'{'A','B','C' }´ 并想知道是否可以通过“B”值查找此列
  • @DiegoMacario:是的,可以使用 ElementCollection 并在 Hibernate 实体模型中定义数组字段(并像 stackoverflow.com/questions/14090364/… 一样查询它)或定义自己的数组用户类型(类似于 stackoverflow.com/questions/21940642/… )。
【解决方案2】:

所以你有单个字符的数组...问题是在 PG 中不是固定长度的。我有这个问题,但大约 10 年前。那时我将该列映射为字符串,这样我就能够处理内部数据 - 只需按逗号切片,然后执行所需的操作。 如果你讨厌这种方式,就像我一样... 查找带有 text[] 类型的列 - 这更常见,因此很容易找到一些东西。请看这个示例项目: https://github.com/phstudy/jpa-array-converter-sample

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 2012-09-16
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多