[英]How can I write Java CriteriaBuilder for the query given below
如何在 Java CriteriaBuilder 中编写查询?
SELECT c FROM UserTransaction c WHERE c.status in ('M', 'P') AND
instr(c.idNumber,:idNum) > 0 order by c.userI
注意:idNum 是一个变量
请看我开始写的内容。 但我无法编译它。
CriteriaBuilder cb = em.getCriteriaBuilder();
ParameterExpression<String> idnumParameter = cb.parameter(String.class, idNum);
ParameterExpression<Integer> numberParameter = cb.parameter(Integer.class)
CriteriaQuery<UserTransaction > cq = cb.createQuery(UserTransaction .class);
Root<UsasTransaction> postRoot = cq.from(UserTransaction .class);
Predicate predicateInM = cb.equal(postRoot.get("status"),"M");
Predicate predicateInP = cb.equal(postRoot.get("status"),"P");
Predicate predicateStatus = cb.or(predicateInM, predicateInP);
Predicate predicateInstr = (Predicate) cb.function("INSTR", Boolean.class, postRoot.get("idNumber"), idnumParameter );
Predicate predicateGt = cb.gt(predicateInstr, 0);
嗨,欢迎来到 StackOverflow :)
首先,发布问题时,请确保提供与问题相关的所有信息。 “我无法编译”之类的术语太含糊了。 如您所知,在编程中细节很重要,因此我们需要更详细的信息以帮助您喜欢:是否存在编译错误? 如果是这样,错误消息是什么,在哪一行? 等等等等
不过,看看代码,有几件事:
将它们放在一起,请尝试以下操作:
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
String idNumParamName = "idnum";
String idNumParamValue = "ABC123";
CriteriaBuilder cb = em.getCriteriaBuilder();
ParameterExpression<String> idnumParameter = cb.parameter(String.class, idNumParamName);
ParameterExpression<Integer> numberParameter = cb.parameter(Integer.class) ;
CriteriaQuery<UserTransaction > cq = cb.createQuery(UserTransaction .class);
Root<UserTransaction> postRoot = cq.from(UserTransaction .class);
Predicate predicateInM = cb.equal(postRoot.get("status"),"M");
Predicate predicateInP = cb.equal(postRoot.get("status"),"P");
Predicate predicateStatus = cb.or(predicateInM, predicateInP);
Expression<Integer> expressionInstr = cb.function("INSTR", Integer.class, postRoot.get("idNumber"), idnumParameter );
Predicate predicateGt = cb.gt(expressionInstr, 0);
cq.select(postRoot).where(cb.and(predicateStatus, predicateGt));
UserTransactions = em.createQuery(cq).setParameter(idNumParamName, idNumParamValue).getResultList();
So I ran the query slightly modified like this: List<String> statusList = new ArrayList<String>();
statusList.add( “R”); statusList.add( “T”);
CriteriaBuilder cb = em.getCriteriaBuilder(); ParameterExpression idnumParameter = cb.parameter(String.class,idNum);
CriteriaQuery cq = cb.createQuery(UserTransaction .class); Root postRoot = cq.from(UserTransaction .class);
表达式表达式= postRoot.get(“status”); 谓词predicateStatus = expression.in(statusList);
//编辑返回Integer Expression expressionInstr = cb.function(“INSTR”,Integer.class,postRoot.get(“idNumber”),idnumParameter); 谓词谓词Gt = cb.gt(expressionInstr,0);
cq.select(postRoot)。凡(cb.and(predicateStatus,predicateGt)); cq.orderBy(cb.asc(postRoot.get( “usasOutRecId”)));
UserTransactions = em.createQuery(cq).getResultList();
但我收到此错误:org.hibernate.QueryException:并未设置所有命名参数:[param2] [从UserTransaction选择generatedAlias0为generatedAlias0其中(generatedAlias0.status in(:param0,:param1))和(INSTR(generatedAlias0) .idNumber,:param2)> 0)order by generateAlias0.userRecId asc]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.