从数据库返回值时的数字格式异常(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 { 
} 
+0

这就是正确的感谢Ammar。我会在10分钟内接受你的回答。 :) – sfrj

java.lang.NumberFormatException:对于输入字符串: “URL”

#{record.url} 

这表明Record实际上Object[],因为它期待一个整数索引像这样

#{record[0]} 

确实,您的查询是错误的,它不是选择Record,而是单个字段,它将返回List<Object[]>个别字段而不是List<Record>。演员阵容(会产生一个警告)不会阻止/改变。

+0

Ups,我明白我的意思,所以这意味着我需要类似'Select * from Record' – sfrj

+0

当我输入我的答案时,我看到Ammar已经发布了正确的语法答案(我也赞成它),所以我省略了它不要打扰他。我只是试图解释潜在的原因,这样才能理解这个例外。 – BalusC

+0

我现在就修好了。这是一个愚蠢的错误,它不是第一次赞助我:)谢谢。 – sfrj

为了避免将来出现这样的错误,您应该使用类型化查询来代替转换。

从无类型查询投射查询结果是一个相当古老的做法(实际上从2006年开始),不应该再使用。

一些额外提示:您不必为EJB指定显式名称。只有@Stateless就够了。 CDI bean也是如此,它将获得默认名称。

然后,您可能需要重新考虑EJB接口的名称。最初我最近有点皱眉。

另外,为从支持bean返回的数据创建getter更为常见。之后,您可以使用值绑定(在EL扩展中省略())。

最后,您可能希望将调用移动到您的EJB到@PostConstruct方法,因为JSF可能会多次调用您的支持bean的方法,现在每次都会导致DB调用。如果你这样做,你的bean也应该是最好的视图范围,但这意味着你必须从CDI bean转到常规JSF管理的bean,或者使用seam 3.