Как отобразить NamedNativeQuery в классе, который не соответствует одной таблице

У меня есть устаревшая база данных SQL Server, и они дали мне запрос, который объединяет несколько таблиц.

ВЫБЕРИТЕ TipoDia, ServBus, Instante, Evento, [VistaHorariosActivos].Linea, Coche, [VistaHorariosActivos].Sublinea, [VistaHorariosActivos]. Секция, Punto, Типо, Viaje, Operador, Fecha, [VistaHorariosacosacosco. SAEBase].[Dbo]. [VistaHorariosActivos] ВНУТРЕННЕЕ СОЕДИНЕНИЕ LineaSublineaSeccionOrden.Sublinea И [VistaHorariosActivos].Seccion = LineaSublineaSeccionOrden.Seccion ГДЕ Fecha>:fecha И VistaHorariosActivos.Macro=: макрос И VistaHorariosActivos.Linea= = 1a = = строка:

Я хочу отобразить эти результаты в класс Java (TripDTO): у меня есть каждый столбец, сопоставленный с их правильным типом данных.

Проблема в том, что я не знаю, должен ли класс TripDTO иметь аннотации @Entity и @table. На самом деле этот запрос не связан ни с одной таблицей.

Может ли кто-нибудь помочь мне определить этот класс?

Вот вам код:

package model;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.Table;

import org.hibernate.annotations.Type;

@NamedNativeQueries({
    @NamedNativeQuery(
        name = "getTripDtos",
        query = "<<the query>>",
        resultClass = TripDTO.class
    )   
})
@Entity
@Table(name = "???")
public class TripDTO implements Serializable {

    /*
     * Atributos 
     */
    private static final long serialVersionUID = 5719572417390931185L;

    @Id
    @Column(name = "Macro", insertable = false, updatable = false)
    @Type(type = "usertype.IdMacroUserType")
    private Short macro;
    @Id
    @Column(name = "Linea", insertable = false, updatable = false)
    private Short linea;
    @Id
    @Column(name = "Sublinea", insertable = false, updatable = false)
    private Byte sublinea;
    @Id
    @Column(name = "Seccion", insertable = false, updatable = false)
    @Type(type = "usertype.IdSeccionUserType")
    private Integer seccion;
    @Id
    @Column(name = "Punto", insertable = false, updatable = false)
    private Integer punto;
    @Id
    @Column(name = "Instante", insertable = false, updatable = false)
    private Integer instante;

    @Column(name = "TipoDia", insertable = false, updatable = false)
    @Type(type = "usertype.TipoDiaUserType")
    private String tipoDia;
    @Type(type = "usertype.ServicioBusUserType")
    @Column(name = "ServBus", insertable = false, updatable = false)
    private Integer servBus;
    @Column(name = "Evento", insertable = false, updatable = false)
    @Type(type = "usertype.TipoEventoUserType")
    private Short evento;
    @Column(name = "Coche", insertable = false, updatable = false)
    private Byte coche;
    @Column(name = "Tipo", insertable = false, updatable = false)
    @Type(type = "usertype.TipoNodoUserType")
    private Short tipo;
    @Column(name = "Viaje", insertable = false, updatable = false)
    private Integer viaje;
    @Column(name = "Operador", insertable = false, updatable = false)
    private String operador;
    @Column(name = "Fecha", insertable = false, updatable = false)
    private LocalDateTime fecha;
    @Column(name = "Ruta", insertable = false, updatable = false)
    private Integer ruta;
    @Column(name = "OrdenSeccion", insertable = false, updatable = false)
    private Integer ordenSeccion;
    ...

1 ответ

Если у вас есть именованный запрос, и вы хотите сопоставить его с результирующим классом (всегда сущностью), вы должны аннотировать его @Entity аннотаций. Вы не обязаны комментировать это @Table но hibernate (jpa в целом) должен знать, что этот класс является сущностью. Вы также не должны аннотировать свое поле с @Column поскольку вы просто используете dto, а не постоянную строку таблицы (ваша сущность не ссылается на конкретную таблицу в БД).

Сделав аннотацию, вы можете использовать resultClass свойство, где вы определяете свой dto @Entity аннотированный класс. В этом классе должны быть все поля, соответствующие выходным столбцам вашего запроса. Так что, если, например, один столбец Orden_Seccionэто должно быть точно имя поля класса dto.

Вы также можете использовать resultMappings, но я думаю, как я вижу из вашего запроса, что resultClass хорошо и чисто для вашей ситуации.

Другие вопросы по тегам