Исключение числового формата при возврате значений из базы данных (JPA) - PullRequest
0 голосов
/ 27 августа 2011

Я хочу заполнить простой тег h: datatable некоторыми значениями из базы данных.Но я получаю исключение и не могу найти причину:

java.lang.NumberFormatException: для входной строки: "url"

Вот так я создаюthe datatable:

<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>

Это базовый компонент за этой страницей:

@Named("managementBB")
@SessionScoped
public class ManagementBB implements Serializable{

    @EJB
    private ILinkManagerEJB linkManagerEJB;

    public List<Record> retrieveRecords() {     
            return linkManagerEJB.retrieveRecords();
    }
}

Это 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 ...
}

Как вы видите, это выглядит просто, и я делал это раньше, но теперь я в замешательстве, я незнаю почему не работает.Не могли бы вы помочь мне найти мою ошибку?

Примечание. Я вполне уверен, что синтаксис запроса в порядке (я проверял его в записках Eclipse)

Ответы [ 3 ]

3 голосов
/ 27 августа 2011

java.lang.NumberFormatException: для входной строки: "url"

 #{record.url}

Это говорит о том, что Record равно на самом деле и Object[], потому что оно ожидает целочисленный индекс, такой как

#{record[0]}

Действительно, ваш запрос неверен, он не выбирает Record, а только отдельные поля, которые возвращали бы List<Object[]> с отдельными полями вместо List<Record>. Приведение (которое генерировало бы предупреждение) не предотвращает / не изменяет это.

2 голосов
/ 27 августа 2011

Неправильный запрос.

@NamedQueries({ @NamedQuery(name = "allrecordinfo", query = "SELECT r FROM Record r") })
@Entity
public class Record {
}
1 голос
/ 28 августа 2011

Чтобы предотвратить такую ​​ошибку в будущем, вы должны использовать типизированный запрос вместо приведения.

Приведение результата запроса из запроса без типа - довольно старая практика (фактически с 2006 года), которую больше не следует использовать.

Некоторые дополнительные подсказки: вам не нужно указывать явное имя для вашего EJB. Достаточно просто @Stateless. То же самое относится к компоненту CDI, который получит имя по умолчанию.

Тогда вы можете переосмыслить имя интерфейса EJB. Начальное «Я» в последнее время немного нахмурилось.

Кроме того, более распространенным является создание метода получения данных, возвращаемых из компонента поддержки. После этого вы можете использовать привязку значения (опустите () в эксперименте EL).

Наконец, вы можете захотеть переместить вызов вашего EJB в метод @PostConstruct, поскольку JSF может вызывать методы вашего компонента поддержки много раз, что теперь каждый раз приводит к вызову DB. Если вы сделаете это, ваш bean-компонент также должен быть наилучшим в области видимости, но это означает, что вы должны либо перейти от компонентов CDI к обычным управляемым компонентам JSF, либо использовать шов 3.

...