...没有子类,因此返回时不检查数据存储区

时间:2013-01-17 20:07:04

标签: jpa datanucleus entitymanager

即使数据库中存在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;参数?

请咨询

感谢,

1 个答案:

答案 0 :(得分:1)

“不检查数据存储”表示它知道要返回的对象的类型是什么,因此它不检查数据存储区以验证类型。为什么只返回null才能回答,因为您知道数据存储区中的内容,日志中的内容以及该类的内容。

尖括号表示JDBC语句的参数(因此在真实语句中为“?”)。这是LOGGING,而不是数据存储区。