2011-07-21 8 views
6

Mam problem z użyciem natywnego zapytania w trybie hibernacji do aliasu komponentu bean, który zawiera właściwości enum. Otrzymuję wyjątek InvocationTargetException, gdy wywoływana jest metoda query.list(). Mój przykład jest poniżej:Hibernate - Użyj natywnego zapytania i aliasu do Bean z właściwościami enum?

@Entity(name = "table1") 
public class Class1 { 
    @Column(name = "col1") 
    @NotNull 
    private Integer prop1; 

    @Column(name = "col2") 
    @NotNull 
    private String prop2; 

    @Column(name = "col3", length = 6) 
    @Enumerated(value = EnumType.STRING) 
    private MyEnumType prop3; 

    // ... Getters/Setters... 
} 

public List getClass1List(){ 
    String sql = "select col1 as prop1, col2 as prop2, col3 as prop3 from table1"; 

    Session session = getSession(Boolean.FALSE); 
    SQLQuery query = session.createSQLQuery(sql); 
    query.addScalar("col1", Hibernate.INTEGER); 
    query.addScalar("col2", Hibernate.STRING); 
    query.addScalar("col3", Hibernate.STRING); 

    query.setResultTransformer(Transformers.aliasToBean(Class1.class)); 

    return query.list(); 
} 

Podczas query.addScalar ("Col3" Hibernate.STRING) wezwanie, nie wiem jaki typ użyć do Col3 (typ enum). Hibernate.String nie działa! Próbowałem również całkowicie wyłączyć ten typ (query.addScalar ("col3")), ale otrzymuję ten sam wyjątek InvocationTargetException. Czy ktoś może mi przy tym pomóc? Mój model nie może zostać zmieniony i utknąłem w natywnym zapytaniu SQL. Wszelkie pomysły są doceniane.

+0

Jeśli aliasing "col1 as prop1" w wyciągu sql, czy Hibernate będzie w stanie go zamapować? –

Odpowiedz

2

Po pierwsze, nie należy używać

private EnumType prop3; 

ale

private ActualEnum prop3; 

ActualEnum Gdzie jest twój własny typ enum (np Fruits odróżnić jabłka i pomarańcze).

Po drugie, mapowanie hibernacji nie ma znaczenia, gdy używasz natywnego sql.

Teraz mam kilka opcji, które mogę zaproponować. Możesz spróbować użyć addEntity() zamiast paczki skalarów. Możliwe, że Hibernate rozpozna właściwość enum i poprawnie mapuje.

Inną opcją jest posiadanie zestawu ustawień niepublicznego, który pobierałby łańcuch z bazy danych, konwertował go na wyliczenie i ustawiał właściwość rzeczywistą.

Wreszcie można dostosować transformator. Ale to prawdopodobnie najbardziej skomplikowana opcja.

+0

W rzeczywistości używam swojego własnego typu wyliczeniowego, to przez czysty przypadek i niedbalstwo użyłem EnumType. Pytanie zostało zredagowane, niezły chwyt. Zanim opublikowaliśmy, wybrałem drugą opcję, więc spróbuję wypróbować pierwszą opcję. Możesz edytować swoją odpowiedź, aby odzwierciedlić zmiany w moim pytaniu. – javagruffian

3
// In public List getClass1List() method: 
// 1. DEFINE: 
Properties params = new Properties(); 
params.put("enumClass", "enumerators.MyEnumType"); 
params.put("type", "12"); 

// 2. REPLACE: 
// query.addScalar("col3", Hibernate.STRING); 
// X 

query.addScalar("col3", Hibernate.custom(org.hibernate.type.EnumType.class, params)); 
Powiązane problemy