0

私は従来の SQL Server データベースを持っており、複数のテーブル間で何らかの結合を行うクエリを提供してくれました。

SELECT TipoDia, ServBus, Instante, Evento, [VistaHorariosActivos].Linea, Coche, [VistaHorariosActivos].Sublinea, [VistaHorariosActivos].Seccion, Punto, Tipo, Viaje, Operador, Fecha, [VistaHorariosActivos].Macro, Ruta, OrdenSeccion FROM [ SAEBase].[dbo].[VistaHorariosActivos] INNER JOIN [SAEBase].[dbo].[LineaSublineaSeccionOrden] ON [VistaHorariosActivos].Macro = LineaSublineaSeccionOrden.Macro AND [VistaHorariosActivos].Linea = LineaSublineaSeccionOrden.Linea AND [VistaHorariosActivos].Sublinea = LineaSublineaSeccionOrden.Sublinea AND [VistaHorariosActivos].Seccion = LineaSublineaSeccionOrden.Seccion WHERE Fecha>:fecha AND VistaHorariosActivos.Macro=:macro AND VistaHorariosActivos.Linea=:linea AND (イベント = 1 OR イベント = 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が、休止状態 (一般的には jpa) は、このクラスがエンティティであることを知る必要があります。永続化されたテーブル行ではなく dto を使用しているだけなので、フィールドに注釈を付ける@Column必要もありません (エンティティは DB 内の特定のテーブルを参照していません)。

アノテーションを行っresultClassたら、dto@Entityアノテーション付きクラスを定義するプロパティを使用できます。このクラスには、クエリの出力列に対応するすべてのフィールドが必要です。したがって、たとえば 1 つの列がである場合Orden_Seccion、これは dto クラスのフィールド名とまったく同じである必要があります。

resultMappingsも使用できますが、クエリからわかるように、それresultClassはあなたの状況に適していてきれいだと思います。

于 2016-09-20T12:35:45.037 に答える