Hibernate: Użycie adnotacji @Transient (JPA) dla pola przy użyciu SQLQuery zwraca null

0

Mam:

@Entity
@Table(name="test")
public class Test
{
        @Id
        @Column(name="name")
	private String field1;
	
        @Column(name="test_f_id")
	private Integer testFid;

	@Transient
	private String field2;
        
        ..
}

Mam gettery, settery.

StringBuffer sb = new StringBuffer();
sb.append("select t.name as filed1, ff.name as field2 ");
sb.append(" from test t");
sb.append(" join test_f ff on ff.id = t.test_ff_id");
SQLQuery query = session.createSQLQuery(sb.toString());
query.addEntity(Test.class);

Pola filed1 oraz testFid są uzupełnianie, a field2 to null.

Co muszę wykonać by każde pole zostało wypełnione?

0

a jestes pewien ze po zlaczeniu tabel test i test_f dla kazdego rekordu z test istenie odpowiadajacy mu w test_f z niepustym polem name?

0
massther napisał(a)

a jestes pewien ze po zlaczeniu tabel test i test_f dla kazdego rekordu z test istenie odpowiadajacy mu w test_f z niepustym polem name?

Jestem. W bazie jest takie założenie.

0

Jeżeli chcesz, aby kolumna była pobierana z bazy, ale nie były do niej wpisane wartości przy insert/update, to użyj adnotacji @Column (http://download.oracle.com/javaee/5/api/javax/persistence/Column.html) z opcjami insertable=false i updatable=false

Z @transient kolumna w ogóle nie jest pobierana z bazy.


Przy okazji - odradzam stosowanie createSQLQuery, zdecydowanie lepiej używać createQuery.
SQLQuery w zasadzie przydaje się tylko w dwóch przypadkach:
-nie mamy modelu encji
-chcemy wykorzystać coś bardzo specyficznego dla konkretnej bazy

Jeżeli np. będziesz chciał zmienić nazwę tabeli, to przy SQLQuery będziesz musiał zmienić to w każdym zapytaniu, a w przypadku Query tylko w adnotacji @Table.

0
__krzysiek85 napisał(a)

Jeżeli chcesz, aby kolumna była pobierana z bazy, ale nie były do niej wpisane wartości przy insert/update, to użyj adnotacji @Column (http://download.oracle.com/javaee/5/api/javax/persistence/Column.html) z opcjami insertable=false i updatable=false

Z @transient kolumna w ogóle nie jest pobierana z bazy.


Przy okazji - odradzam stosowanie createSQLQuery, zdecydowanie lepiej używać createQuery.
SQLQuery w zasadzie przydaje się tylko w dwóch przypadkach:
-nie mamy modelu encji
-chcemy wykorzystać coś bardzo specyficznego dla konkretnej bazy

Jeżeli np. będziesz chciał zmienić nazwę tabeli, to przy SQLQuery będziesz musiał zmienić to w każdym zapytaniu, a w przypadku Query tylko w adnotacji @Table.

Dzięki za sugestie. Pole field2 wypełnione jest u mnie po wykonaniu kilku złączeń. W tym szczególnym przypadku "muszę" skorzystać z SQLQuery. Jedynym rozwiązaniem jak na razie jest użycie konstruktora klasy Test w zapytaniu.

0
Adam napisał(a)

Pole field2 wypełnione jest u mnie po wykonaniu kilku złączeń. W tym szczególnym przypadku "muszę" skorzystać z SQLQuery. Jedynym rozwiązaniem jak na razie jest użycie konstruktora klasy Test w zapytaniu.

Niekoniecznie - możesz skorzystać z adnotacji SecondaryTable i na polu field2 dać adnotację @Column z table=test_f

http://download.oracle.com/javaee/5/api/javax/persistence/SecondaryTable.html

Przykład (zwrócić uwagę, że podstawową tabelą jest test_f, gdyż to test ma referencję do klucza głównego tabeli test_f):

@Entity
@Table(name="test_f")
@SecondaryTable(name="test", 
        pkJoinColumns=@PrimaryKeyJoinColumn(name="test_ff_id"))

public class Test
{
        @Id
        @Column(name="name",table="test")
        private String field1;
       
        @Column(name="test_f_id", table="test")
        private Integer testFid;

        @Column(name="test_f_id", table="test_f")
        private String field2;
       
        ..
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1