частично сопоставление результата NamedNativeQuery с классом

0 Ganonside [2014-08-01 15:58:00]

У меня есть класс @Entity Person, у которого есть несколько полей, и я хотел бы сопоставить результат нескольких @NamedNativeQuery с классом Person однако запросы, которые я запускаю, не возвращают значения для каждого поля класса Person. Когда я пытаюсь запустить запрос, я получаю следующие ошибки:

[error] o.h.u.JDBCExceptionReporter - Invalid column name bar.
[error] play - Cannot invoke the action, eventually got an error: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query

Мой класс настроен аналогично этому:

@NamedNativeQueries({
    @NamedNativeQuery(
        name = "getBirthdate",
        //Returns values for {idnumber, name, birthdate}
        query = "EXEC dbo.proc_get_birthdate :name",
        resultClass = Person.class
    ),
    @NamedNativeQuery(
        name = "getBar",
        //Returns values for {idnumber, name, bar}
        query = "EXEC dbo.proc_get_bar :name",
        resultClass = Person.class
    )
})
@Entity
public class Person {
    @Id
    @Column(name = "idnumber")
    private int idNumber;
    @Column(name = "name")
    private String name;
    @Column(name = "birthdate")
    private String birthdate;
    @Column(name = "foo")
    private String foo;
    @Column(name = "bar")
    private String bar;

    //All appropriate getter and setter methods are implemented
}

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

Мой фактический класс намного больше, и из-за этого и некоторых проблем с безопасностью я не хочу, чтобы мои запросы возвращались в поле КАЖДЫЙ, и я надеюсь, что есть простой способ просто дать им значение null если значение не является возвращенный запросом. Я попытался установить для каждого поля значение null в объявлении (пример ниже), но это тоже не сработало.

@Column(name = "bar")
private String bar = null;

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

java hibernate jpa playframework-2.2


1 ответ


0 uaiHebert [2014-08-02 06:37:00]

Я считаю, что вы неправильно @NamedNativeQuery использование @NamedNativeQuery. Эта аннотация должна использоваться с SQL Query, а не с хранимой процедурой. Глядя на исключение SQLGrammarException: could not execute query можно увидеть, что это исключение для грамматики, запрос не может быть проанализирован.

С JPA 2.1 вы можете использовать аннотацию @NamedStoredProcedureQuery которая поддерживает хранимые процедуры.