即使数据库中存在D1,调用em.find(Department.class,“D1”)也会返回null。
调试日志显示消息为: id的唯一候选者是com.ge.dsp.iwork.entity.Department并且没有子类,因此在不检查数据存储区的情况下返回
这是什么意思?为什么它返回null?
然后我尝试使用
departmentId = emp.getDepartment().getDeptNo().trim();
Query query = em.createQuery("SELECT d FROM Department d WHERE
trim(d.deptNo) = :departmentId");
query.setParameter("departmentId", departmentId);
注意:在传递给参数之前,departmentId已经被修剪。
日志中打印的查询为:
SELECT 'com.ge.dsp.iwork.entity.Department' AS
NUCLEUS_TYPE,D.DEPTNAME,D.DEPTNO,D.LOCATION,D.MGRNO FROM DEPARTMENT D WHERE D.DEPTNO =
<'D1'>
并返回0行。
当我将查询修改为
时 departmentId = emp.getDepartment().getDeptNo().trim();
Query query = em.createQuery("SELECT d FROM Department d WHERE trim(d.deptNo) = :departmentId"); // 'D1'");
query.setParameter("departmentId", departmentId.trim());
注意:在将其设置为参数时,departmentId现在再次修剪。
日志文件将查询显示为:
SELECT 'com.ge.dsp.iwork.entity.Department' AS NUCLEUS_TYPE,D.DEPTNAME,D.DEPTNO,D.LOCATION,D.MGRNO FROM DEPARTMENT D WHERE D.DEPTNO = 'D1'
并从DB返回实体。
为什么会这样? datanuclueus何时添加尖括号&lt;&gt;参数?
请咨询
感谢,
答案 0 :(得分:1)
“不检查数据存储”表示它知道要返回的对象的类型是什么,因此它不检查数据存储区以验证类型。为什么只返回null才能回答,因为您知道数据存储区中的内容,日志中的内容以及该类的内容。
尖括号表示JDBC语句的参数(因此在真实语句中为“?”)。这是LOGGING,而不是数据存储区。