Criteria API = ANY(?1) 表达式怎么写?
Criteria API how to write = ANY(?1) expression?
我有一个查询要转换为标准 API。
一个查询
select a, b, c from myTable t where t.e = ANY(?1)
在 java 处理后(原生 sql 查询)最终查询如下所示
select a, b, c from myTable t where t.e = ANY(array['prop1', 'prop2', 'prop3'])
我的问题是如何将 = ANY(?1)
部分翻译成标准 API?
我看到 any() 定义是
public <Y> Expression<Y> any(Subquery<Y> subquery)
如何将值数组放入其中?
我正在使用 PostgreSQL
您将需要一个自定义 SQLFunction
来呈现您想要的 SQL,例如
public class ArrayAny implements SQLFunction {
@Override
public boolean hasArguments() {
return true;
}
@Override
public boolean hasParenthesesIfNoArguments() {
return true;
}
@Override
public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
return firstArgumentType;
}
@Override
public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException {
return "any(" + args.get(0) + "::text[])";
}
}
您必须在方言中注册该函数。那么你应该可以像这样使用函数:
query.where(
criteriaBuilder.equal(
root.get("e"),
criteriaBuilder.function('any', String.class, arrayAsString),
)
);
我有一个查询要转换为标准 API。
一个查询
select a, b, c from myTable t where t.e = ANY(?1)
在 java 处理后(原生 sql 查询)最终查询如下所示
select a, b, c from myTable t where t.e = ANY(array['prop1', 'prop2', 'prop3'])
我的问题是如何将 = ANY(?1)
部分翻译成标准 API?
我看到 any() 定义是
public <Y> Expression<Y> any(Subquery<Y> subquery)
如何将值数组放入其中?
我正在使用 PostgreSQL
您将需要一个自定义 SQLFunction
来呈现您想要的 SQL,例如
public class ArrayAny implements SQLFunction {
@Override
public boolean hasArguments() {
return true;
}
@Override
public boolean hasParenthesesIfNoArguments() {
return true;
}
@Override
public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
return firstArgumentType;
}
@Override
public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException {
return "any(" + args.get(0) + "::text[])";
}
}
您必须在方言中注册该函数。那么你应该可以像这样使用函数:
query.where(
criteriaBuilder.equal(
root.get("e"),
criteriaBuilder.function('any', String.class, arrayAsString),
)
);