在 @Lob 字段中搜索 IndexOutOfBound

Posted

技术标签:

【中文标题】在 @Lob 字段中搜索 IndexOutOfBound【英文标题】:IndexOutOfBound searching in a @Lob field 【发布时间】:2012-09-24 12:48:33 【问题描述】:

我在 @Lob 字段中进行搜索查询时遇到了奇怪的行为。

我将 HSQLDB 和 Hibernate 与 JPA2 一起使用。

查询是:@NamedQuery(name = "URL.findByPathAndDomain", query = "select u from URL u where u.path = :path and u.domain.domain = :domain")(顺便说一下,path 是@lob 字段)。

我在 DAO 中实现了这样的方法:

public URL findByPathAndDomain(String path, String domain) 
        URL url = null;
        TypedQuery<URL> query = em().createNamedQuery("URL.findByPathAndDomain", URL.class);
        query.setParameter("path", path);
        query.setParameter("domain", domain);
        try 
            url = query.getSingleResult();
         catch (NoResultException e) 
            logger.error(e.getMessage());
        
        return url;
    

我得到了这个例外:

Caused by: org.hibernate.exception.GenericJDBCException: java.lang.NullPointerException java.lang.NullPointerException
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at $Proxy45.executeQuery(Unknown Source)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1897)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1698)
    at org.hibernate.loader.Loader.doQuery(Loader.java:832)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
    at org.hibernate.loader.Loader.doList(Loader.java:2382)
    at org.hibernate.loader.Loader.doList(Loader.java:2368)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198)
    at org.hibernate.loader.Loader.list(Loader.java:2193)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:285)
    ... 10 more

如果我删除 @Lob 注释,一切都会好起来的。 它是 HSQLDB 错误、Hibernate 错误还是什么?

编辑:我将 PU 更改为使用 mysql 而不是 HSQLDB,它像老板一样工作......

【问题讨论】:

【参考方案1】:

NPE 发生在 Hibernate 的 StandardSQLExceptionConverter 中。去年发现并报告了类似的 NPE。我记得在某些情况下,当数据库无法进行转换时,Hibernate 的错误报告被破坏并导致 NPE。

最好的做法是使用大的 VARCHAR 字段而不是 LOB。

【讨论】:

嗯,有趣,最好的方法是什么?

以上是关于在 @Lob 字段中搜索 IndexOutOfBound的主要内容,如果未能解决你的问题,请参考以下文章

转载JDBC操作LOB字段

LOB字段HWM问题 收缩高水位线的测试

[转帖]Oracle数据库lob大对象数据类型字段总结,值得收藏

创建表规范 lob 字段

Oracle LOB类型

Struts+Spring+Hibernate处理Lob(Blob,Clob)