我想在 Spring Data JPA 存储库中使用 JPA 2.0 类型表达式@Query
,但它给了我一个验证错误验证方法公共(public)抽象 java.util 的查询失败。列出 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;
...
}
请求的实体:
@Entity(name = "Lamp")
@Table(name = "LAMP")
public class LampEntity {
@ManyToOne
@JoinColumn(name = "LOCATION_ID", referencedColumnName = "ID")
private LocationEntity location;
}
存储库:
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);
...
}
我使用 spring-data-JPA 1.4.1.RELEASE
和 Hibernate 4.2.7.Final
作为提供程序。
我的问题是:
- 是否可以使用 Spring data JPA 来做到这一点?
- 在旧的 stackoverflow 帖子中,我看到 Hibernate 仅通过
InheritanceType.SINGLE_TABLE
接受它,但也许现在在 4.2.7 中可以了? - 如果不是,如果我想保留
InheritanceType.TABLE_PER_CLASS
策略,我可以采取什么替代方案?
非常感谢
更新了Floor
和Room
之间的独特约束和关系
最佳答案
如果您使用 Spring JPA 存储库,则无需使用 @Query
即可通过将该方法重命名为:
public List<LampEntity> findByLocation_Code(@Param("code") String locationCode);
只需确保所有 setter 和 getter 都就位即可。
关于java - 使用实体类型表达式的 Spring data JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626546/