JPA:使用BLOB列的“SELECT DISTINCT”

3

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

SELECT DISTINCT i FROM Table i JOIN i.other o

出现以下错误:

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

我理解这个错误,但是我该如何解决它?


你在使用哪个数据库?知道这一点会很有帮助... - cliff.meyers
我正在使用Java DB(derby)和EclipseLink。 - Cogsy
4个回答

3
你可以在另一列中存储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将不会重建我的对象... - Cogsy
它确实可以,你只需要在 SQL 查询语句上多动点心思...我会在我的回答中添加一个例子。 - DanSingerman

2

得到HermanD的启发后,我找到了这个可行的解决方案:

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

0

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


0

在你的查询中使用setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)代替distinct。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接