Dom*_*aja 3 hibernate jpa criteria-api metamodel jpa-2.0
我确实有一个带有NUMBER(实际上是BigDecimal,不要问为什么)列的静态元模型.现在我想对该数字列进行LIKE查询:
CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");
Run Code Online (Sandbox Code Playgroud)
哪里entity.get(Entity_.numbercol)返回一个Path<BigDecimal>.当然,我得到一个编译错误:...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)
.as(String.class)由于JPA中存在一些错误而导致列失败,但我现在手头没有错误编号.但是,在最新版本的JPA/Hibernate中并没有修复它.无论如何,它会导致生成一些无效SQL语句的运行时异常.
现在我只需要一种方法来获得与SQL相当的标准API
... WHERE numbercol LIKE '123%';
Run Code Online (Sandbox Code Playgroud)
搜索主题已经提出了以下响应,这没有帮助,因为我有一个静态元模型: NHibernate - 使用Criteria API对整数列进行LIKE搜索的最简单方法?和JPA/Criteria API - 喜欢和平等的问题
有任何想法吗?
在此先感谢Dominik
Ale*_*der 12
对于仍在寻找解决方案的人们.
知道HQL str函数完成了这项工作(至少对于Hibernate v.3.6.9.Final),可以实现自己的FunctionExpression:
//plagiarized from org.hibernate.ejb.criteria.expression.function.CastFunction
public class StrFunction<Y extends Number> extends BasicFunctionExpression<String> implements FunctionExpression<String>, Serializable {
public static final String FCT_NAME = "str";
private final Selection<Y> selection;
public StrFunction(CriteriaBuilder criteriaBuilder, Selection<Y> selection) {
super((CriteriaBuilderImpl) criteriaBuilder, String.class, FCT_NAME);
this.selection = selection;
}
@Override
public void registerParameters(ParameterRegistry registry) {
Helper.possibleParameter(selection, registry);
}
@Override
public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
return FCT_NAME + '(' + ((Renderable) selection).render(renderingContext) + ')';
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它:
cb.like(new StrFunction<Long> (cb, root.get(MyObject_.id)), "%mySearchTerm%");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5946 次 |
| 最近记录: |