我正在使用Java EE 6开发应用程序。我需要编写一个搜索功能,这就是我想出的:
books=getEntityManager().createQuery(
"SELECT b FROM BookEntity b WHERE b.ISBN LIKE ?1 OR b.title LIKE ?2 OR b.price = ?3 OR b.bookYear = ?4 OR b.bookLanguage LIKE ?5")
.setParameter(1, key)
.setParameter(2, key)
.setParameter(3, key)
.setParameter(4, key)
.setParameter(5, key)
.getResultList();
这会导致异常,我发现问题是price和bookYear是浮点值和整数值,此方法仅适用于字符串字段。所以我试着跟随:
books=getEntityManager().createQuery(
"SELECT b FROM BookEntity b WHERE b.ISBN LIKE ?1 OR b.title LIKE ?2 OR b.price = ?3 OR b.bookYear = ?4 OR b.bookLanguage LIKE ?5")
.setParameter(1, key)
.setParameter(2, key)
.setParameter(3, Float.parseFloat(key))
.setParameter(4, Integer.parseInt(key))
.setParameter(5, key)
.getResultList();
它仍然无法运作。 请帮帮我。
老实说,我认为它们是最无益的例外,因为它们没有描述与问题相关的任何内容。这些是我每次调试应用程序时遇到的异常,每个调试会话一次。(我按照我得到的顺序列出了它们):
1。)"在EntityManager中创建查询时发生异常: 异常描述:解析查询时出现语法错误[SELECT b FROM APP.BOOKENTITY b在哪里像ISBN一样?或类似于标题?2或价格如何?3或BOOKYEAR LIKE?4或BOOKLANGUAGE LIKE?5],第1行,第17列:语法[。]处的错误。 内部异常:UnwantedTokenException(found =。,expected 80)"
2。)"在EntityManager中创建查询时发生异常: 例外描述:编译查询时出错[SELECT b FROM BOOKENTITY b在哪里像国际标准书?1或标题类似?2或价格如何?3还是像BOOKYEAR一样?4还是像BOOKLANGUAGE一样?5]。未知的实体类型[BOOKENTITY]。"
3。)"在EntityManager中创建查询时发生异常: 例外描述:编译查询时出错[SELECT b FROM BookEntity b WHERE ISBN LIKE?1 OR title LIKE?2 OR price LIKE?3 OR bookYear LIKE?4 OR bookLanguage LIKE?5],第1行,第33列:未知标识变量[ ISBN]。查询的FROM子句不声明标识变量[isbn]。"
4。)"在EntityManager中创建查询时发生异常: 例外描述:编译查询时出错[SELECT b FROM BookEntity b WHERE b.isbn LIKE?1 or b.title LIKE?2 or b.price LIKE?3 or b.bookYear LIKE?4 or b.bookLanguage LIKE?5],第1行,第35列:类[ejb.BookEntity]的未知状态或关联字段[isbn]。"
5。)" java.sql.SQLSyntaxErrorException:没有名为' LIKE'的授权例程类型'功能'找到了兼容的参数。"
答案 0 :(得分:0)
很抱歉延迟回复。
首先,您在代码中显示的查询看起来是正确的。我尝试了一个参数化LIKE的类似例子,它的工作原理。但我很困惑你为什么要使用'键'所有setParameters的变量。在使用setParameter方法设置参数时,请检查BOOKENTITY实体的数据类型是否正常。
所有前4个例外都是有效的,看起来你已经纠正了它们,如果我是正确的话,最终会在第5个例外情况下坚持下去。
对于第5个例外,如果有的话,请打印关于例外的更多细节。另外请检查setParameters是否负责'键的BOOKENTITY的数据类型。变量