我在为我们的业务构建的此查询中有一个关于加入用户表的问题。它是基于用户完成的7个不同任务的小生产率报告。
有两个任务表: 1)核对表任务 2)请求的任务
请求的任务是Checklist Task的扩展。 请求的任务具有REQUESTED DATE列,该列位于请求的任务表中 请求的任务具有COMPLETED DATE列,该列位于Checklist Task表中。
当我运行下面的查询时,显然是SecurityIdentity表,它仅由CompletedByID通过Checklist Task表连接以显示其全名。
任务名称'录制的文档'这是一个请求的核对表,具有请求日期(RequestedDate来自请求任务表)和接收日期(来自核对表表的CompletedDate),来自上面提到的两个不同的表。
for (int i = 0, max = questions.size(); i < max; i++) {
Question question = questions.get(i);
/* all of that previous code */
if (question.getId() == null) {
entityManager.persist(question);
}
else {
/* merge() returns the newly merged and managed (as in it is now part of
the persistence context) instance, so replace the "old" one */
questions.set(i, entityManager.merge(question));
}
}
然而,斯泰西没有要求,但凯西做了。因此,结果日期/时间戳应该显示为Kathy请求Recorded Docs而不是Stacey。
我已经尝试了很多不同的方法来加入安全身份表来纠正这个问题,但是无法这样做..任何帮助都会非常感激!
的SecurityIdentity
答案 0 :(得分:2)
我认为您的问题可能与您在Task表中加入的ID有关。正如现在所写,无论是谁请求任务,您将显示完成任务的人的姓名,因为您已加入CompletedByID。如果请求与分配同义,那么您应该加入AssignedToID。在任何情况下,您都需要确定要显示的名称并加入相应的ID。
以下是我注意到的其他一些可以改变/改进的事情:
在 OR op.NAME LIKE'WO115%'之后,你错过了一个右括号。除非您确切知道自己要做什么,否则不应允许OR和AND语句在同一组括号中组合使用。
您可以将所有那些op.Name替换为'XXXX%',并将其替换为()
使用下面的功能,如果您的姓名没有编入索引,或者您有大量记录,您可能会看到一些显着的减速。你现在拥有它的方式并没有错,但使用下面显示的in()可能会更容易。
LEFT(op.Name,4) in('XXXXX%','YYYYY%',...,'ZZZZZ%')