Java 使用实体类型表达式的Spring数据JPA
我想在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
@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);