0

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

并从数据库返回实体。

为什么会出现这种情况?datanuclueus 何时在参数中添加尖括号 <>?

请指教

谢谢,

4

1 回答 1

1

“不检查数据存储”意味着它知道要返回的对象的类型是什么,因此它不会检查数据存储以验证类型。为什么它返回 null 只有您可以回答,因为您知道数据存储中的内容、日志中的内容以及该类是什么。

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

于 2013-01-19T08:26:47.323 回答