【问题标题】:JPA: 'SELECT DISTINCT' with BLOB columnsJPA:带有 BLOB 列的“SELECT DISTINCT”
【发布时间】:2009-01-26 16:13:08
【问题描述】:

我正在尝试运行这个 JPQL 查询:

SELECT DISTINCT i FROM Table i JOIN i.other o

立即失败:

“内部异常:java.sql.SQLException:'BLOB' 类型的列不能用于 CREATE INDEX、ORDER BY、GROUP BY、UNION、INTERSECT、EXCEPT 或 DISTINCT 语句,因为该类型不支持比较。 "

这个错误对我来说是有意义的,但我该如何解决呢?

【问题讨论】:

  • 您使用的是哪个数据库?知道会很有帮助...
  • 我正在使用 Java DB (derby) 和 EclipseLink

标签: java jpa jql


【解决方案1】:

您可以将 blob 对象的哈希或校验和存储在另一列中,并在其上使用您的 distinct 运算符。

例子:

SELECT i from Table  WHERE id IN (
  SELECT id FROM (
    SELECT MIN(id) AS id, hash_of_i FROM Table GROUP BY hash_of_i
                 ) t
                                )

我相信你可以更优雅地编写这个 SQL,但它会给你一个想法。

编辑 - 刚刚意识到使用它可以完全省去 Distinct 运算符(它在功能上等同于删除它)。

编辑 2 - 我不确定我的第一个版本是否有效,所以重写了它

【讨论】:

  • 我相信 distinct 实际上会比较每一个被选中的列。 'i' 指的是绑定到该表的整个对象,即。所有的列。任何低于此值,JPA 都不会重建我的对象...
  • 确实如此,你只需要对你的 sql 更可爱一点...我会在我的答案中添加一个示例
【解决方案2】:

HermanD 的一些启发使我找到了这个可行的解决方案:

SELECT i FROM Table i WHERE EXISTS (
    SELECT e FROM Table e JOIN e.other o WHERE e.id=i.id
)

【讨论】:

    【解决方案3】:

    BLOB 类型的列中的值只是指向实际数据存储的指针。为了应用这些运算符中的任何一个,您需要从 BLOB 加载数据并实现您自己的逻辑,因为数据可以表示任何东西(图像、文本......)

    【讨论】:

      【解决方案4】:

      在查询中使用 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 而不是 distinct。

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 1970-01-01
        • 2021-05-28
        • 2015-08-24
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        相关资源
        最近更新 更多