从数据库返回值时的数字格式异常(JPA)
我想用数据库中的某些值填充简单的h:datatable标记。但我得到一个例外,我无法找到是什么原因:从数据库返回值时的数字格式异常(JPA)
java.lang.NumberFormatException:对于输入字符串:“URL”
这是我如何创建数据表:
<h:form>
<h:dataTable value="#{managementBB.retrieveRecords()}" var="record">
<h:column>
<f:facet name="header">URL</f:facet>
#{record.url}
</h:column>
<h:column>
<f:facet name="header">Submition date</f:facet>
#{record.submitionDate}
</h:column>
<h:column>
<f:facet name="header">Unacceptable</f:facet>
#{record.unnaceptableContent}
</h:column>
<h:column>
<f:facet name="header">Option</f:facet>
Something
</h:column>
</h:dataTable>
</h:form>
这是此页后面的支持bean:
@Named("managementBB")
@SessionScoped
public class ManagementBB implements Serializable{
@EJB
private ILinkManagerEJB linkManagerEJB;
public List<Record> retrieveRecords() {
return linkManagerEJB.retrieveRecords();
}
}
这个我s表示访问数据库的EJB来获取数据:
@Stateless(name = "ejbs/LinkManagerEJB")
public class LinkManagerEJB implements ILinkManagerEJB {
@PersistenceContext
private EntityManager entityManager;
public List<Record> retrieveRecords() {
Query allRecords = entityManager.createNamedQuery("allrecordinfo");
return (List<Record>) allRecords.getResultList();
}
}
最后这是表示在数据库中的一行的JPA实体:
@Entity
@NamedQueries({@NamedQuery(name = "allrecordinfo",
query = "SELECT r.url, r.submitionDate, r.unnaceptableContent FROM Record r")})
public class Record {
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
private String url;
@Column(nullable = false)
private String submitionDate;
@Column(nullable = false)
private boolean unnaceptableContent;
//Get set methods ...
}
正如你看到的,它看起来简单,我以前做过这个但现在我很困惑,我不知道为什么不工作。你能帮我找到我的错误吗?
注:我是非常有信心的是,查询语法是OK(我在Eclipse的剪贴簿测试过)
查询是不正确的。
@NamedQueries({ @NamedQuery(name = "allrecordinfo", query = "SELECT r FROM Record r") })
@Entity
public class Record {
}
java.lang.NumberFormatException:对于输入字符串: “URL”
#{record.url}
这表明Record
是实际上的Object[]
,因为它期待一个整数索引像这样
#{record[0]}
确实,您的查询是错误的,它不是选择Record
,而是单个字段,它将返回List<Object[]>
个别字段而不是List<Record>
。演员阵容(会产生一个警告)不会阻止/改变。
为了避免将来出现这样的错误,您应该使用类型化查询来代替转换。
从无类型查询投射查询结果是一个相当古老的做法(实际上从2006年开始),不应该再使用。
一些额外提示:您不必为EJB指定显式名称。只有@Stateless就够了。 CDI bean也是如此,它将获得默认名称。
然后,您可能需要重新考虑EJB接口的名称。最初我最近有点皱眉。
另外,为从支持bean返回的数据创建getter更为常见。之后,您可以使用值绑定(在EL扩展中省略())。
最后,您可能希望将调用移动到您的EJB到@PostConstruct方法,因为JSF可能会多次调用您的支持bean的方法,现在每次都会导致DB调用。如果你这样做,你的bean也应该是最好的视图范围,但这意味着你必须从CDI bean转到常规JSF管理的bean,或者使用seam 3.
这就是正确的感谢Ammar。我会在10分钟内接受你的回答。 :) – sfrj