繁体   English   中英

如何为下面给出的查询编写 Java CriteriaBuilder

[英]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 :)

首先,发布问题时,请确保提供与问题相关的所有信息。 “我无法编译”之类的术语太含糊了。 如您所知,在编程中细节很重要,因此我们需要更详细的信息以帮助您喜欢:是否存在编译错误? 如果是这样,错误消息是什么,在哪一行? 等等等等

不过,看看代码,有几件事:

  • UsasTransaction - 我认为这只是一个错字
  • 谓词。 请注意,不同的包中有多个不同的类,称为“Predicate”,并且您的 IDE 默认可能会建议错误的类,因此您需要确保导入正确的类。
  • cb.function - 返回一个表达式,而不是一个谓词

将它们放在一起,请尝试以下操作:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM