QueryDSL就像操作SimplePath一样

时间:2015-09-04 14:36:57

标签: sql jpa sql-like querydsl

this question类似,我想使用我自己的用户定义类型“AccountNumber”执行SQL“like”操作。

QueryDSL Entity类定义列的字段如下所示:

public final SimplePath<com.myorg.types.AccountNumber> accountNumber;

我已尝试使用以下代码在SQL中实现“like”操作,但在运行查询之前比较类型时会出错:

final Path path=QBusinessEvent.businessEvent.accountNumber;
final Expression<AccountNumber> constant = Expressions.constant(AccountNumber.valueOfWithWildcard(pRegion.toString()));
final BooleanExpression booleanOperation = Expressions.booleanOperation(Ops.STARTS_WITH, path, constant);
expressionBuilder.and(booleanOperation);

错误是:

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [7!%%] did not match expected type [com.myorg.types.AccountNumber (n/a)]

有没有人能够使用QueryDSL / JPA组合实现这一目标?

3 个答案:

答案 0 :(得分:0)

您是否尝试使用String常量?

Path<?> path = QBusinessEvent.businessEvent.accountNumber;
Expression<String> constant = Expressions.constant(pRegion.toString());
Predicate predicate = Expressions.predicate(Ops.STARTS_WITH, path, constant);

答案 1 :(得分:0)

最后,我的同事给了我一个小费来做以下事情:

 if (pRegion != null) {
        expressionBuilder.and(Expressions.booleanTemplate("{0} like concat({1}, '%')", qBusinessEvent.accountNumber, pRegion));
 }

这似乎可以解决问题!

答案 2 :(得分:0)

似乎存在错误/含糊不清。在我的情况下,我需要使用不同类型的几个字段(StringNumber)进行搜索,例如SQL看起来像:

SELECT * FROM table AS t WHERE t.name = "%some%" OR t.id = "%some%";

我的代码如下:

BooleanBuilder where = _getDefaultPredicateBuilder();
BooleanBuilder whereLike = new BooleanBuilder();
for(String likeField: _likeFields){
    whereLike = whereLike.or(_pathBuilder.getString(likeField).contains(likeValue));
}
where.and(whereLike);

如果第一个_likeFieldsString的类型 - 请求正常,否则会抛出异常。

相关问题