【问题标题】:Searching a text string inside a LOB field using QueryDSL使用 QueryDSL 在 LOB 字段中搜索文本字符串
【发布时间】:2021-03-09 12:32:58
【问题描述】:

我目前正在使用 QueryDSL,我必须添加一个 WHERE 子句来按存储大量信息(可读文本)的字段进行过滤,并将其创建为 LOB 字段。

这是我实体中的字段:

@Lob
@Column(name = "MY_FIELD", nullable = true)
private byte[] myField;

这是在我的“Q”类中以这种方式生成的:

public final ArrayPath<byte[], Byte> myField = createArray("myField", byte[].class);

我可以毫无问题地恢复该字段中的信息。但是,当我尝试添加过滤子句时,我意识到ArrayPath 对象没有like 方法,因此我尝试以不同的方式进行。

我尝试了不同的方法,我想出了这个:

Expressions.predicate(Ops.LIKE, Expressions.stringPath("MY_FIELD"), Expressions.constant(stringValue));

上一个谓词生成的SQL代码如下:

...
WHERE
    MY_FIELD like '%?%' escape '!'
...

如果我尝试直接在我的数据库中执行此 SQL 命令,它会完美运行,它会根据“?”恢复正确的行。参数。然而,我的应用程序没有恢复它们中的任何一个,即使它正在执行相同的 SQL 命令。

我有什么遗漏吗?可以换一种方式吗?

非常感谢您。

PS:我使用的是 SQL Server 2011。

【问题讨论】:

    标签: java sql querydsl


    【解决方案1】:

    默认情况下,byte[] 映射到数组路径。对于 (C)LOB,您希望将其映射为字符串路径。您可以通过指定QueryType 来提示代码生成器:

    @Lob
    @QueryType(PropertyType.STRING)
    @Column(name = "MY_FIELD", nullable = true)
    private byte[] myField;
    

    但是,@Column(name = "MY_FIELD", nullable = true) 似乎暗示您查询的是 JPA 而不是普通的 SQL。请注意,某些 JPA 供应商可能不支持 CLOB 的 like 函数。

    【讨论】:

    • 如果我以这种方式映射字段,则会收到以下错误:参数值 [abc] 与预期类型不匹配 [[B (n/a)]
    • 我不确定 Hibernate 是否(大概)可以处理 likebyte[] 字段。验证您是否可以在没有 querydsl 的情况下编写 JPQL 查询并查看它是否实际执行。否则,我建议将该字段映射到 StringClob
    • 在这种情况下,我得到的是来自 Hibernate 的“错误的列类型”错误。我最后做的是创建一个带有 CLOB 转换字段 (CONVERT(VARCHAR(max), MY_FIELD, 0)) 的视图,并使用它而不是原来的 LOB 视图。不是最好的,我知道,但我没有找到任何其他方法来做到这一点。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2021-04-25
    • 2021-05-02
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多