2017-08-28 284 views
0

我有以下查询,试图获取使用@Embeddable ID类的一部分Employee实体对象:JPA JPQL查询返回null

public List<EmployeeTask> getEmployeeById(){ 
        return em.createQuery("SELECT a FROM EmployeeTask a where a.id.empcode = '5091'").getResultList(); 

上面的代码我的JSF页面上的返回null。但是当我改变这个:

public List<EmployeeTask> getEmployeeById(){ 
         return em.createQuery("SELECT a FROM EmployeeTask a where a.id.empcode like '5091'").getResultList(); 

它再次返回null。但是,当我尝试:

public List<EmployeeTask> getEmployeeById(){ 
         return em.createQuery("SELECT a FROM EmployeeTask a where a.id.empcode like '5091%'").getResultList(); 

} 

返回预期的实体对象的内容...任何人都知道为什么出现这种情况?

有关我需要执行的更多详细信息:EmployeeTask表包含员工执行的所有任务。 EmployeeTaskPK是字符串empcode,字符串任务代码,起始日期。我想在我的实体实例中获取给定empcode的所有记录,并将它们列在jsf数据表中。

谢谢

+1

检查您的db:empcode列是一个char大小为4的字符吗?也许有空格 – Zeromus

+0

empcode是NCHAR(8)。非常感谢。我想如果我将它定义在我的实体的属性@Column它将工作 – Bonzay

+0

不行columnDefinition =“NCHAR(8)”不起作用。任何想法如何在jpa中使用nchar数据类型? – Bonzay

回答

1

的问题是不是在JPA但在数据库列定义,如果你希望你的列是一个固定大小CHAR,或在这种情况下NCHAR,是你走什么。

问题是当你有一个长度较短的字符串,如只有大小为4的“5091”时: 你在db中得到的结果是“5091”,最后有四个空格。

查询不会返回行,因为“5091”用空格是由“5091”不同没有,唯一的一个正常工作是like '5091%'

您可以通过使用NVARCHAR这将修剪下长度字符串解决或在查询中添加需要的空格(对我来说这似乎是一个不好的做法)

public List<EmployeeTask> getEmployeeById(){ 
        return em.createQuery("SELECT a FROM EmployeeTask a where a.id.empcode = '5091 '").getResultList(); 
+0

谢谢你的建议。改变数据库目前不是一个选项。我用trim功能来解决这个问题:'return em.createQuery(“SELECT a FROM EmployeeTask a where TRIM(a.id.empcode)like'5091'”).getResultList();' – Bonzay