1

由于我将 QueryDsl 更新到版本 4.2.1,因此在执行 JPAQuery 时出现异常。在我使用 3.7.4 之前,它运行良好。

我隔离了这个实体的问题:

@Entity(name = "TEST")
public class Test implements Serializable {

    @Id
    @Column(name = "TEST_ID", nullable = false)
    private Long id;

    @Column(name = "TEST_NAME", nullable = false)
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我编写了一个调用此方法的 JUnit 测试:

public void test() {
    QTest qTest= QTest.test;
    JPAQuery<Test> query = getJpaQueryFactory().selectFrom(qTest);
    query.where(qTest.name.startsWith("test"));
    List<Test> tests = query.fetch();
}

这运行良好并返回应有的内容。但是,当我颠倒 StringExpression.startsWith 方法的顺序时,我得到一个奇怪的异常。

public void test() {
    QTest qTest= QTest.test;
    JPAQuery<Test> query = getJpaQueryFactory().selectFrom(qTest);
    StringExpression longName = Expressions.asString("test01");
    query.where(longName.startsWith(qTest.name));
    List<Test> tests = query.fetch();
}

在 fetch() 方法上,我得到:

IllegalArgumentException : You have attempted to set a value of type class java.lang.String
for parameter 1 with expected type of class java.lang.Boolean from query string
select test from TEST test where ?1 like concat(test.name,?2) escape '!'.

我使用调试器来挖掘 querydsl 代码,并且作为异常状态,查询生成器期望参数 1 的布尔值,但我不知道为什么。

此外,它将“%”作为参数 1,将我的搜索字符串“test01”作为参数 2。不过应该反过来。

有人见过这个吗?对我来说,这似乎是 QueryDSL 4.2.1 中的一个错误,但也许我这边有疏忽。

提前感谢您的帮助!

4

0 回答 0