Criteria Query说错类型(Postgres运算符不存在)

时间:2017-08-18 16:35:13

标签: postgresql jpa criteria-api

我有这样的查询,其中我只希望员工在我的数据库empId表中没有usrIdempIdentifierAction在Action表中形成一个外键。)

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Emp> q = cb.createQuery(Emp.class);
    Root<Emp> c = q.from(Emp.class);

    List<Predicate> predicates = new ArrayList<Predicate>();

    Subquery<Action> sq = q.subquery(Action.class);
    Root<Action> ac = sq.from(Action.class);

    sq.select(ac);
    sq.where(cb.equal(ac.get("actionCd"), "CLOSE"));

    predicates.add(c.get("empId").in(sq).not());
    predicates.add(c.get("usrId").in(sq).not());
    predicates.add(c.get("empIdentifier").in(sq).not());

    ....

    q.where(predicates.toArray(new Predicate[]{}));

执行此查询时,出现以下错误:

 org.postgresql.util.PSQLException: ERROR: operator does not exist: text = numeric
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

empIdusrId都是我的数据库中的数字字段,但empIdentifier是文本。如果我只有empIduserId或只有empIdentifier谓词,那么查询工作正常,但我需要将这三个一起完成。我似乎只能查询数值或文本值,而不是两者一起查询。

我该如何解决这个问题?这是postgres还是JPA问题?我对我的数据库和类进行了双重和三重检查,并且它们都具有相应的类型。出于某种原因,它认为empIdentifier是一个数值,或者是将它与数值进行比较,而不是像真正的那样将其比较。

编辑:

来自日志的SQL查询:

from emps."emp" emp0_ where 

(emp0_."empid" not in  (select action1_."actionid" from emps."action" action1_ 
where action1_."actioncd"=?))

 and 

(emp0_."usrid" not in  (select action2_."actionid" from emps."action" action2_ 
where action2_."actioncd"=?)) 

and 

(emp0_."empidentifier" not in  (select action3_."actionid" from emps."action" 
action3_ where action3_."actioncd"=?)) 

0 个答案:

没有答案