java - 使用实体类型表达式的 Spring data JPA

标签 java hibernate jpa jpa-2.0 spring-data-jpa

我想在 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.RELEASEHibernate 4.2.7.Final 作为提供程序。

我的问题是:

  1. 是否可以使用 Spring data JPA 来做到这一点?
  2. 在旧的 stackoverflow 帖子中,我看到 Hibernate 仅通过 InheritanceType.SINGLE_TABLE 接受它,但也许现在在 4.2.7 中可以了?
  3. 如果不是,如果我想保留 InheritanceType.TABLE_PER_CLASS 策略,我可以采取什么替代方案?

非常感谢


更新了FloorRoom之间的独特约束和关系

最佳答案

如果您使用 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/

相关文章:

java - 在 Hibernate Multi-Tenancy 配置中禁用 Spring 数据源配置

java - 使用 JPA avec setter 调用的持久对象自动更新

java - 保存新实体时在 ManyToOne/OneToMany 关系上创建重复条目

java - 使用 H2 和 Hibernate 的 Spring JPA 无法正确自动增量

java - 如何正确设置 gradle 命令输出编码?

java - 无法直接调用 TextToSpeech 实例的 speak()

java - 在有状态的 ejb 扩展中通过查找找到的 JPA 实体不受管理

java - 我应该包含 JPA 的 main 方法吗?

java - 使用 p2 更新 Eclipse E4 应用程序

java - Spring MVC Java多线程: perform an SQL statement in the background