Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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
Java 使用实体类型表达式的Spring数据JPA_Java_Hibernate_Jpa_Jpa 2.0_Spring Data Jpa - Fatal编程技术网

Java 使用实体类型表达式的Spring数据JPA

Java 使用实体类型表达式的Spring数据JPA,java,hibernate,jpa,jpa-2.0,spring-data-jpa,Java,Hibernate,Jpa,Jpa 2.0,Spring Data Jpa,我想在spring数据JPA存储库@Query中使用JPA 2.0类型表达式,但它为方法public abstract java.util.List my.org.FooRepository.findAllByRoomCode()的查询提供了一个验证错误验证失败 以下是我的实体定义: 继承的: @Entity(name = "Location") @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract cl

我想在spring数据JPA存储库
@Query
中使用JPA 2.0类型表达式,但它为方法public abstract java.util.List my.org.FooRepository.findAllByRoomCode()的查询提供了一个验证错误
验证失败

以下是我的实体定义:

继承的:

@Entity(name = "Location")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class LocationEntity {

    @Column(name = "CODE")
    protected String code;

    @OneToMany(mappedBy = "location")
    protected List<LampEntity> lamps = new ArrayList<LampEntity>();
        ...
}

@Entity(name = "Floor")
@Table(name = "FLOOR", uniqueConstraints = {
    @UniqueConstraint(name = "FLOOR_UK", columnNames = "CODE")
})
public class FloorEntity extends LocationEntity {
    ...
    @OneToMany(mappedBy = "floor")
    private List<RoomEntity> rooms = new ArrayList<RoomEntity>();
    ...
}

@Entity(name = "Room")
@Table(name = "ROOM", uniqueConstraints = {
    @UniqueConstraint(name = "ROOM_UK", columnNames = { "CODE", "FLOOR_ID" })
})
public class RoomEntity extends LocationEntity {
    ...
    @ManyToOne
    @JoinColumn(name = "FLOOR_ID", nullable = false, referencedColumnName = "ID")
    private FloorEntity floor;
    ...
}
存储库:

public interface LampRepository extends JpaRepository<LampEntity, Long> {

    @Query("SELECT lamp FROM Lamp lamp WHERE lamp.location.code = :locationCode AND TYPE(lamp.location) = Room")
    public List<LampEntity> findAllByRoomCode(@Param("code") String locationCode);
    ...
}
公共接口存储库扩展了JpaRepository{
@查询(“从lamp lamp中选择lamp,其中lamp.location.code=:位置代码和类型(lamp.location)=房间”)
公共列表findAllByRoomCode(@Param(“code”)字符串位置代码);
...
}
我使用
spring数据jpa1.4.1.RELEASE
hibernate4.2.7.Final
作为提供程序

我的问题是:

  • 用Spring数据JPA可以做到这一点吗
  • 在一篇旧的stackoverflow帖子中,我看到Hibernate只接受了
    InheritanceType.SINGLE_TABLE
    ,但现在可能在4.2.7中就可以了
  • 如果没有,如果我想保留我的
    InheritanceType.TABLE\u PER\u CLASS
    策略,我的备选方案是什么
  • 非常感谢



    更新了
    楼层
    房间

    之间的唯一约束和关系。如果使用Spring JPA存储库,则无需
    @Query
    即可通过将方法重命名为:

    public List<LampEntity> findByLocation_Code(@Param("code") String locationCode);
    
    公共列表findByLocation\u代码(@Param(“code”)字符串位置代码);
    

    只需确保所有的setter和getter都已就位。

    好吧,我错了,我误解了一些事情,没有完全阅读stacktrace:

  • 该错误不属于Spring数据,而是属于Hibernate。由
  • 引起的真正的
    org.hibernate.QueryException:无法解析属性:class of:xxx.yyy.LampEntity[从xxx.yy.LampEntity中选择灯lamp WHERE lamp.location.code=:locationCode和TYPE(lamp.location)=房间]
  • 由于属性
    在这里有明确的名称,我运行了两个有效性测试(下面的请求在功能上完全不正确,仅针对语法):
  • @Query(“从lamp lamp中选择lamp,其中lamp.location.code=:代码和类型(lamp)=lamp”)
    失败,堆栈跟踪相同

    @Query(“从lamp lamp中选择lamp,其中lamp.location.code=:code和lamp.location.class=房间”)
    正常,工作正常,返回预期结果(仅具有房间位置的灯)

    我创建了一个新的存储库
    公共接口位置存储库扩展了JpaRepository
    ,并测试了:

    @Query(“从类型(位置)=房间和位置的位置中选择位置。代码=:代码”)
    正常,工作正常

    因此,我将使用
    lamp.location.class
    (特定于Hibernate:(),因为Hibernate(或JPA?)似乎不允许在HQL请求中键入属性或属性,也不允许未继承的实体(这是一个)


    请让我知道这个答案是否有任何补充或更正。

    是的,但在这种情况下,我会得到一个不正确的结果。事实上,我的
    code
    唯一约束与具体实现相关,而不是与抽象类相关。我可以有一个
    楼层
    和一个
    房间
    ,使用相同的代码。是否还有一个
    Location
    表中的
    type
    字段。不。在
    Location
    实体上既没有
    type
    字段,也没有
    @DiscriminatorColumn
    。顺便说一句,
    Location
    只是一个抽象的
    实体
    ,没有表可以让你发布完整的stace跟踪,你看到了吗?没关系,我发现了问题并不是Spring数据JPA故障;),它属于Hibernate。我现在不能发布我的分析(少于10个),我会在几个小时后发布
    public List<LampEntity> findByLocation_Code(@Param("code") String locationCode);