Как отобразить 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
хорошо и чисто для вашей ситуации.