Может ли объект JPA с полем @Transient хранить данные из SQL-запроса ResultSet? - PullRequest
2 голосов
/ 21 октября 2011

Пример:

@Entity
class Table_A{
    @Id
    @generatedValue
    private long ID;

    @Column
    private String name;

    @Transient
    private String otherName;

    // getters and setters

    public long getID()
    { return ID;}
    public void setID(long ID)
    { this.ID = ID;}

     public String getName()
    { return Name;}
    public void setName(String name)
    { this.name = name;}

    public String getOtherName()
    { return otherName;}
    public void setOtherName(String otherName)
    { this.otherName = otherName;}
}

Пример запроса:

String sql = "SELECT Table_A.*, otherName 
FROM Table_A INNER JOIN Other_Table ON Table_A.id = Other_Table.id";

List<Table_A> = em.createNativeQuery(sql, Table_A.class).getResultList();

ПРИМЕЧАНИЕ:

столбец «otherName» является полем Other_Table.

Other_Table не является сущностью

ПРОБЛЕМА:

проблема в том, что я не могу сохранить результат столбца "otherName" в @Transientполе объекта Table_A.Есть ли способ сделать это?Всегда возвращает ноль.

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Проблема в том, что вы использовали форму createNativeQuery , которая предполагает возможность поместить результат непосредственно в ваш класс Table_A - но, конечно, otherName не будет отображаться.

Если вы используете другую форму createNativeQuery , которая использует именованное @SqlResultSetMapping, вы можете иметь возможность получить значение otherName в @ColumnResult, который вы можете использовать.Взгляните на пример здесь .

Боюсь, вам все равно, вероятно, придется в какой-то момент вручную позвонить setOtherName(): - (

1 голос
/ 21 октября 2011

Нет, это невозможно.Но исправление очевидно: сопоставьте Other_Table с сущностью и установите связь между обеими сущностями.Принудительное использование переходных полей и запросов SQL в большинстве случаев является признаком неправильного дизайна JPA.Не борись с JPA.Используйте его так, как он предназначен, и все будет намного проще.

...