我有这样的查询,其中我只希望员工在我的数据库empId
表中没有usrId
,empIdentifier
和Action
在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.
empId
和usrId
都是我的数据库中的数字字段,但empIdentifier
是文本。如果我只有empId
和userId
或只有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"=?))