让我们说我有一个名为Vehicle的超类,就像这样:
@Entity
public class Vehicle {
private LocalDateTime dateTimeOfCreation;
}
并且,让我们说我有一个名为Car的子类:
@Entity
public class Car extends Vehicle{
}
并且,我想要选择在某个日期之后创建的所有汽车。而且,虽然dateTimeOfCreation
字段在超类中,但我需要能够查询子类以了解我不易探索的原因。
我尝试了此查询:SELECT c from Car c WHERE c.dateTimeOfCreation > :dateTime
然而,我得到一个ORA-00904:无效的标识符错误,这在某种程度上是合乎逻辑的,因为类车没有该字段和汽车。此外,我正在使用JOINED INHERITANCE,因此每个类都有它的表,dateTimeOfCreation
存储在Vehicle表中。这是我无法改变的事情,再次是因为难以解释的原因。
Car是我实施的一个类,也需要是一个实体。但是,框架会跟踪创建时间,我需要在查询中使用该信息。但是,我不能直接查询车辆,因为我只需要汽车,而不是卡车,自行车等。
答案 0 :(得分:0)
您将Vehicle
声明为en实体,因为您已使用javax.persistence.Entity
注释它。您不应该或者您应该将其声明为抽象类。
您还可以通过使用Vehicle
注释注释javax.persistence.MappedSuperclass
类来指定映射的超类。
例如:
@MappedSuperclass
public class Vehicle {
private LocalDateTime dateTimeOfCreation;
}
如果您不想查询Vehicle实体,该解决方案是合适的。
答案 1 :(得分:0)
类车辆
@Entity(name = "vehicle")
@Inheritance(strategy= InheritanceType.JOINED)
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private LocalDateTime dateTimeOfCreation;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public Date getDateTimeOfCreation() {
return date;
}
public void setDateTimeOfCreation(Date date) {
this.date = date;
}
}
Class Car:
@Entity(name = "car")
@PrimaryKeyJoinColumn(name = "vehicle_id")
public class Car extends Vehicle {
}
道上课:
public class Abc {
-----your logic-----
Session session = HibernateUtil.getSession();
Query query = session.createQuery("from car as c where c.dateTimeOfCreation >= :date");
query.setParameter("date", LocalDateTime.now());
List<RegularEmployee> regularEmployees = query.list();
}