2015-08-25 10 views
5

Wiele razy używam @Formula w moich jednostkach. Ale zawsze była to prosta kwerenda lub procedura składowana z parametrem, który mogę pobrać jako złożony z tabeli. Teraz potrzebuję użyć pewnej właściwości z powiązanego obiektu. Ale widzę wyjątek, gdy próbuję uzyskać obiekt z DB. Zobacz przykład poniżej:Jak korzystać z pola encji w Hibernate @Formula

@Entity 
@Table(name = "MINISTRY") 
public class Ministry { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "NAME") 
    private String name; 

    // unnecessary code 

} 

@Entity 
@Table(name = "DEPARTMENT") 
public class Department { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "DEP_NAME") 
    private String departmentName; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "MINISTRY_ID") 
    private Ministry ministry; 

    // unnecessary code 
} 

@Entity 
@Table(name = "EMPLOYEE") 
public class Employee { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "DEPARTMENT_ID") 
    private Department department; 

    @Formula("test_package.calc_something(department.ministry.id)") 
    private BigDecimal someMetric; 

    // unnecessary code 

} 

Jak powinienem użyć encji prop w @Formula. Nie chcę napisać coś podobnego

select d.ministry.id from Department d ... 

Odpowiedz

5

Jeśli czytasz Javadoc z Formula widać:

Wzór musi być ważny fragment SQL

SO będziesz musiał użyć języka SQL, takiego jak:

@Formula("test_package.calc_something(" 
      + "select DEP.MINISTRY_ID from DEPARTMENT DEP where DEP.ID = DEPARTMENT_ID" 
     + ")") 
private BigDecimal someMetric; 

Jedyną rzeczą, która została zmodyfikowana przez Hibernate w fragmencie przed napisaniem do SQL: Dodaje alias tabeli do twoich kolumn (ponieważ nie możesz tego przewidzieć). Wspominam o tym, ponieważ do tego celu używany jest tylko podstawowy parser SQL, który wstawi alias w niewłaściwych pozycjach dla bardziej złożonych fragmentów.

uwaga o wydajności: Wzór jest wykonywany dla każdego Department podmiotu że ładunek, nawet jeśli tylko chcesz użyć atrybutu do sortowania lub filtrowania (tylko zgadywać z nazwy atrybutu) - chyba, że ​​używasz @Basic(fetch = FetchType.LAZY) i włącz na podstawie kodowania bajtowego (lub emuluj to przy pomocy FieldHandled).

+0

Dziękujemy za odpowiedź. Ale zostałem napisany na złym przykładzie. Zadaniem jest pobranie parametrów powiązanych obiektów. Zaktualizowałem przykład. Z góry dziękuję. – Dmitry

Powiązane problemy