Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance JPA:TypedQuery不会获得继承类型的结果_Inheritance_Jpa_Named Query - Fatal编程技术网

Inheritance JPA:TypedQuery不会获得继承类型的结果

Inheritance JPA:TypedQuery不会获得继承类型的结果,inheritance,jpa,named-query,Inheritance,Jpa,Named Query,我有一个实体扩展了另一个实体: @Entity @DiscriminatorValue("PARKING") @Table(name="parkingPois") @NamedQueries({ @NamedQuery(name="ParkingPoiDao.findAll", query="SELECT p FROM ParkingPoiDao p"), @NamedQuery(name="ParkingPoiDao.findById", query="SELECT p FR

我有一个实体扩展了另一个实体:

@Entity
@DiscriminatorValue("PARKING")
@Table(name="parkingPois")
@NamedQueries({
    @NamedQuery(name="ParkingPoiDao.findAll", query="SELECT p FROM ParkingPoiDao p"), 
    @NamedQuery(name="ParkingPoiDao.findById", query="SELECT p FROM ParkingPoiDao p WHERE p.parkingPoiId = :parkingPoiId")
})
public class ParkingPoiDao extends PoiDao implements Serializable {
    //@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    @Column(name="parkingPoiId")
    private String parkingPoiId;
    @Column(name="poiId")
    ...
}

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="poiType", discriminatorType=DiscriminatorType.STRING)
@Table(name="pois")
public abstract class PoiDao implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="poiId")
    private int poiId;
...
当我试图查询parkingPoi时,我得到的结果是nor

        TypedQuery<ParkingPoiDao> query =
                em.createNamedQuery("ParkingPoiDao.findAll", ParkingPoiDao.class);
//      TypedQuery<ParkingPoiDao> query =
//              em.createNamedQuery("ParkingPoiDao.findById", ParkingPoiDao.class)
//              .setParameter("parkingPoiId", facilityId);
//              .setParameter("poiType", "ParkingPOI");
//      ParkingPoiDao pPoiDao = query.getSingleResult();
        List<ParkingPoiDao> pPoiDaos = query.getResultList();
TypedQuery查询=
em.createNamedQuery(“ParkingPoiDao.findAll”,ParkingPoiDao.class);
//类型查询=
//em.createNamedQuery(“ParkingPoiDao.findById”,ParkingPoiDao.class)
//.设置参数(“停车点”,设施ID);
//.设置参数(“poiType”、“ParkingPOI”);
//ParkingPoiDao pPoiDao=query.getSingleResult();
List pPoiDaos=query.getResultList();
(活动查询和未注释查询都没有结果。)

在数据库中,我有一个用于父类的pois表和一个用于parkingPois的“subtable”,其中包含一个外键(pois.poid)


原因是什么?

我必须向您的
ParkingPoiDao
实体添加
parkingPoiId
属性,以便
ParkingPoiDao.findById
命名查询有效:

@Entity
@Table(name="parkingPois")
@NamedQueries({
        @NamedQuery(name="ParkingPoiDao.findAll", query="SELECT p FROM ParkingPoiDao p"),
        @NamedQuery(name="ParkingPoiDao.findById", query="SELECT p FROM ParkingPoiDao p WHERE p.parkingPoiId = :parkingPoiId")
})
public class ParkingPoiDao extends PoiDao {

    private String parkingPoiId;

    public String getParkingPoiId() {
        return parkingPoiId;
    }

    public void setParkingPoiId(final String parkingPoiId) {
        this.parkingPoiId = parkingPoiId;
    }
}
因此,添加了该选项后,以下测试将使用您的两个查询通过:

@Test
@Transactional
public void return_parking_pois() {
    ParkingPoiDao parkingPoi = new ParkingPoiDao();
    parkingPoi.setParkingPoiId("123");
    em.persist(parkingPoi);

    TypedQuery<ParkingPoiDao> query = em
            .createNamedQuery("ParkingPoiDao.findById", ParkingPoiDao.class)
            .setParameter("parkingPoiId", "123");
    List<ParkingPoiDao> pPoiDaos = query.getResultList();

    assertThat(pPoiDaos).hasSize(1);

    query = em.createNamedQuery("ParkingPoiDao.findAll", ParkingPoiDao.class);
    pPoiDaos = query.getResultList();

    assertThat(pPoiDaos).hasSize(1);
}
@测试
@交易的
公共无效返回\停车\泊松(){
ParkingPoiDao parkingPoi=新的ParkingPoiDao();
停车点设置停车点(“123”);
em.persist(parkingPoi);
TypedQuery=em
.createNamedQuery(“ParkingPoiDao.findById”,ParkingPoiDao.class)
.setParameter(“parkingPoiId”、“123”);
List pPoiDaos=query.getResultList();
资产(pPoiDaos)。hasSize(1);
query=em.createNamedQuery(“ParkingPoiDao.findAll”,ParkingPoiDao.class);
pPoiDaos=query.getResultList();
资产(pPoiDaos)。hasSize(1);
}

您是否可以确认您的实体之间的区别,或者添加有关如何持久化
ParkingPoiDao
实体的详细信息?

我正在实现连接的多表继承。 联合继承是最符合逻辑的继承解决方案,因为它在数据模型中镜像了对象模型。在联合继承中,为继承层次结构中的每个类定义一个表,以仅存储该类的本地属性。层次结构中的每个表还必须存储仅在根类中定义的对象id(主键)。层次结构中的所有类必须共享相同的id属性。鉴别器列用于确定特定行属于哪个类,层次结构中的每个类定义其自己唯一的鉴别器值

问题是我必须在类级别添加@ObjectTypeConverter注释,在字段级别添加@Convert注释:

@ObjectTypeConverters({
    @ObjectTypeConverter (
            name="poiTypeConverter",
            dataType=java.lang.String.class,
            objectType=ServiceTypeEnum.class,
            conversionValues={
                @ConversionValue(dataValue="CHARGING", objectValue="CHARGING"),
                @ConversionValue(dataValue="PARKING", objectValue="PARKING")
            }
    )
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="poiType", discriminatorType=DiscriminatorType.STRING)
@Table(name="pois")
public abstract class PoiDao implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="poiId")
    private int poiId;
    @Convert("poiTypeConverter")
    private ServiceTypeEnum poiType;
...

@Entity
@DiscriminatorValue("PARKING")
@Table(name="parkingPois")
@NamedQueries({
    @NamedQuery(name="ParkingPoiDao.findAll", query="SELECT p FROM ParkingPoiDao p"), 
    @NamedQuery(name="ParkingPoiDao.findById", query="SELECT p FROM ParkingPoiDao p WHERE p.parkingPoiId = :parkingPoiId")
})
public class ParkingPoiDao extends PoiDao implements Serializable {
    //@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    @Column(name="parkingPoiId")
    private String parkingPoiId;
    @Column(name="poiId")
    @Convert("parkingPoiStatusConverter")
    @Column(name="status")
    private ParkingPoiStatusEnum status;
    ...
}

当然,如果记录已经在表中,则相应的值必须在数据库中。

您是否尝试在数据库中执行生成的查询以查看任何查询是否有任何结果?我在ParkingPoiDao中已经有ParkingPoId属性。我认为问题在于PoiDao中的poiType列(即鉴别器列)是枚举!??我不确定我是否理解你。
discriminatorType
接受一个
javax.persistence.discriminatorType
(它是一个枚举),但这是经过设计的。如果它仍然不起作用,也许您可以在GitHub上建立一个示例项目或其他东西来查看?