【问题标题】:JPQL Like statement not returning resultsJPQL Like 语句不返回结果
【发布时间】:2014-03-14 20:34:22
【问题描述】:

我的应用程序中有一个 FILE 表(使用 postgreSQL),它存储了我在我的操作系统上拥有的文件的完整路径。

当我尝试执行“喜欢”查询时,当我知道有数据保存时,我一直得到零结果。

这是有问题的查询:

public List<MyFile> getDirectoryFiles(Path path) {
        Query query = em.createQuery("from MyFile f WHERE f.path LIKE :path");
        query.setParameter("path", "////data////myData////.settings% ESCAPE '//'");  // hard coded the path for testing
        return query.getResultList();
}


@Override
public void deleteDirectoryFiles(Path path) {
    for(MyFile file : this.getDirectoryFiles(path)){
        this.delete(file);
    }
}


// in some other method I am deleting the files from a directory
Foo.deleteDirectoryFiles(this);  // points to '/data/myData/.settings'

不知道为什么会这样。当我采用 hibernate 正在生成的内容并插入绝对路径时,我确实在我的数据库中看到了返回的元组。

有人处理过这个问题吗?如果是这样,您是如何解决问题的?我尝试将我的 ':path' 变量硬编码为 "'/data/myData/.settings%'"、"%/data/myData/.settings%"、"//data//myData//.settings% "但仍然没有返回任何内容。没有错误,但我不知道为什么没有结果。

【问题讨论】:

  • 不返回结果的查询不会引发异常。它返回一个空列表。您不应该在您的方法中捕获任何异常。捕获异常只会隐藏错误。让异常冒泡,贴上它的堆栈跟踪,了解异常原因,修复代码。
  • 这对你来说毫无意义,但对我们来说也许不是。如果你认为没有人能理解你不理解的东西,为什么还要问这个问题?
  • getSingleResult() 抛出 NoResultException。 getResultList() 返回一个空列表。阅读 api 文档。你的 catch 块没用。从返回 List 的方法返回 null 是一种不好的做法。
  • 我会解决的。当我知道数据存在时,关于什么可能导致查询返回空的任何建议?

标签: sql hibernate jpa jpql targetinvocationexception


【解决方案1】:

您的查询语法错误,它看起来更像 HQL 查询而不是 JPQL。正确的查询应该是这样的:

em.createQuery("SELECT f FROM MyFile f WHERE f.path LIKE :path");

【讨论】:

  • 在后台我使用的是 Hibernate,所以我知道该语句有效
  • 更改查询只是为了确保它不是语法并且它仍然没有返回任何结果。
  • 我已将查询更新到日志文件生成 SQL 的点,当我将其插入 pgAdmin 时该 SQL 运行正常,但我没有通过 JPA 获得任何结果。
猜你喜欢
  • 2020-08-31
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2014-01-15
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多