2011-08-27 116 views
0

我想用數據庫中的某些值填充簡單的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的剪貼簿測試過)

回答

2

查詢是不正確的。

@NamedQueries({ @NamedQuery(name = "allrecordinfo", query = "SELECT r FROM Record r") }) 
@Entity 
public class Record { 
} 
+0

這就是正確的感謝Ammar。我會在10分鐘內接受你的回答。 :) – sfrj

3

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

1

爲了避免將來出現這樣的錯誤,您應該使用類型化查詢來代替轉換。

從無類型查詢投射查詢結果是一個相當古老的做法(實際上從2006年開始),不應該再使用。

一些額外提示:您不必爲EJB指定顯式名稱。只有@Stateless就夠了。 CDI bean也是如此,它將獲得默認名稱。

然後,您可能需要重新考慮EJB接口的名稱。最初我最近有點皺眉。

另外,爲從支持bean返回的數據創建getter更爲常見。之後,您可以使用值綁定(在EL擴展中省略())。

最後,您可能希望將調用移動到您的EJB到@PostConstruct方法,因爲JSF可能會多次調用您的支持bean的方法,現在每次都會導致DB調用。如果你這樣做,你的bean也應該是最好的視圖範圍,但這意味着你必須從CDI bean轉到常規JSF管理的bean,或者使用seam 3.