0

我有一个旧的 SQL Server 数据库,他们给了我一个查询,它在几个表之间进行了一些连接。

选择 TipoDia、ServBus、Instante、Evento、[VistaHorariosActivos].Linea、Coche、[VistaHorariosActivos].Sublinea、[VistaHorariosActivos].Seccion、Punto、Tipo、Viaje、Operador、Fecha、[VistaHorariosActivos].Macro、Ruta、OrdenSecion FROM [ SAEBase].[dbo].[VistaHorariosActivos] INNER JOIN [SAEBase].[dbo].[LineaSublineaSeccionOrden] ON [VistaHorariosActivos].Macro = LineaSublineaSecionOrden.Macro AND [VistaHorariosActivos].Linea = LineaSublineaSecionOrden.Linea AND [VistaHorariosActivos].Sublinea = LineaSublineaSecionOrden.Sublinea AND [VistaHorariosActivos].Secion = LineaSublineaSecionOrden.Secion WHERE Fecha>:fecha AND VistaHorariosActivos.Macro=:macro AND VistaHorariosActivos.Linea=:linea AND (Evento = 1 OR Evento = 5)

我想将这些结果映射到一个 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;
    ...
4

1 回答 1

2

当你有一个命名查询并且你想将它映射到一个结果类(总是一个实体)时,你必须用注解来注解它@Entity。您没有义务对其进行注释,@Table但hibernate(通常为jpa)需要知道这个类是一个实体。您也不必注释您的字段,@Column因为您只是使用 dto 而不是持久表行(您的实体没有引用数据库中的特定表)。

完成注释后,您可以使用resultClass定义 dto@Entity注释类的属性。此类必须具有与查询的输出列对应的所有字段。因此,例如,如果一列是Orden_Seccion,这应该正是 dto 类的字段名称。

您也可以使用resultMappings,但我认为,正如我从您的查询中看到的那样,这resultClass对您的情况来说是好的和干净的。

于 2016-09-20T12:35:45.037 回答