使用JPA中的JQPL查询获取超类字段值

时间:2017-03-16 16:00:26

标签: java jpa inheritance jpql

让我们说我有一个名为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表中。这是我无法改变的事情,再次是因为难以解释的原因。

编辑:我给的代码只是一个例子。事实上。车辆是我不应该改变的框架的一部分,所以它已经有@Entity注释。

Car是我实施的一个类,也需要是一个实体。但是,框架会跟踪创建时间,我需要在查询中使用该信息。但是,我不能直接查询车辆,因为我只需要汽车,而不是卡车,自行车等。

2 个答案:

答案 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();
}