【问题标题】:Sophisticated JPQL String Query复杂的 JPQL 字符串查询
【发布时间】:2011-04-09 09:05:09
【问题描述】:

我正在尝试对数据库中的字符串字段执行非常复杂的查询。我在 JPQL 不是很有经验,所以我想我会尝试获得一些帮助。

我在数据库中有一个名为FILE_PATH 的字段。在FILE_PATH 字段中,会有如下值:

  • 'C:\temp\files\filename.txt'
  • 'file:\\\C:\testing\testfolder\innerfolder\filename2.txt'

我需要能够仅从用户给定的文件名查询中进行搜索。所以,不是简单地做一个SELECT Table FROM Table AS t WHERE t.filePath LIKE '%:query%',事情将变得更加复杂,以适应路径的文件名部分。文件路径和文件名是动态数据,所以我不能在那里硬编码一个前缀字符串。这让我很困惑,但我知道 JPQL 中有一些字符串表达式可能能够处理这个要求。

基本上,我只需要在FILE_PATH 字段中最后一个“\”之后的任何内容上返回与给定查询匹配的所有行。这可能吗?

感谢您的帮助。

编辑:正在使用的数据库是 SQL Server。

【问题讨论】:

    标签: sql sql-server hql jpql


    【解决方案1】:

    可能最好的解决方案是添加一个仅包含文件名的单独列。如果你不能,那么这可能会起作用(取决于你使用的数据库):

    drop table test;
    create table test(name varchar(255));
    insert into test values('C:\temp\name2\filename.txt');
    insert into test values('file:\\\C:\\innerfolder\filename2.txt');
    select * from test 
    where substring(name, locate('\', name, -1)) like '%name2%'
    

    这是纯 SQL,但据我了解,JPQL 支持所有功能:http://www.datanucleus.org/products/accessplatform/jpa/jpql_functions.html

    一个问题是locate(,,-1)。这意味着“从字符串的末尾开始”。它适用于 H2 数据库,但不适用于 MySQL 和 Apache Derby。它可能适用于 Oracle、SQL Server(我没有测试过)。对于某些数据库,可能需要将 '\' 替换为 '\\'(MySQL、PostgreSQL;不确定 Hibernate 是否会为您这样做)。

    【讨论】:

    • 谢谢。我会试试这个。我使用 SQL Server 作为数据库。
    • 看起来 LOCATE(,,-1) 没有使用 MS SQL Server 从右到左搜索:msdn.microsoft.com/en-us/library/ms186323.aspx "如果 start_location 未指定,为负数或为 0 ,搜索从表达式 2 的开头开始。" - 所以没有反向搜索。是否可以使用本机查询?在这种情况下,您可以使用 REVERSE 来“模拟”从右到左的搜索。
    • 感谢您的研究和帮助。是的,REVERSE 看起来很有希望。使用 SQL 字符串函数的所有组合可以完成的工作令人惊叹。我会及时向大家通报进展和结果。
    【解决方案2】:

    最后的 WHERE 子句:

    LOWER(SUBSTRING(fs.filePath, LENGTH(fs.filePath) - (LOCATE('\\', REVERSE(fs.filePath)) - 2), (LOCATE('\\', REVERSE(fs.filePath)) - 1))) LIKE '%:query%'
    

    注意:为了提高性能,您可能需要保存斜线的位置。

    感谢 Thomas Mueller 的帮助。

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2021-03-23
      相关资源
      最近更新 更多