2014-07-08 7 views
2

봄 데이터 JPA 리포지토리 @Query에서 JPA 2.0 타입 표현식을 사용하고자하지만 유효성 검증 오류 Validation failed for query for method public abstract java.util.List my.org.FooRepository.findAllByRoomCode()!을 제공합니다. 상속스프링 데이터 엔티티 타입 표현식을 사용한 JPA

: 여기

내 개체 정의입니다

@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); 
    ... 
} 

나는을 사용하고 있습니다과 Hibernate 4.2.7.Final을 제공합니다.

내 질문은 :

  1. 는 스프링 데이터 JPA로 그렇게 할 수 있습니까?
  2. 오래된 stackoverflow 게시물에서 나는 최대 절전 모드가 단지 InheritanceType.SINGLE_TABLE으로 그것을 받아 들였지만 4.2.7에서는 괜찮은지 알았다.
  3. 그렇지 않은 경우 내 InheritanceType.TABLE_PER_CLASS 전략을 계속 유지하려면 내 대안은 무엇입니까?

덕분에 많은


고유 제한 조건과 관련하여 업데이트 Floor 사이 Room

+0

당신이 볼 수있는 완전한 스테이시 추적? 괜찮아요 –

+0

을 게시하는 기회를, 나는 문제를 발견하고 한 봄 데이터 JPA 오류가 아닙니다;), 그것은 최대 절전 모드에 속합니다. 지금은 분석을 게시 할 수 없습니다 (평판이 10 개 미만). 몇 시간 후에 게시 해 드리겠습니다. – matiou

답변

0

OK, 내 실수, 나는 몇 가지 오해 완전히 스택 트레이스를 읽지 않은 :

  1. 이 오류가 봄 데이터에 속해 있지 않지만 최대 절전 모드로. ,

@Query("SELECT lamp FROM Lamp lamp WHERE lamp.location.code = :code AND TYPE(lamp) = Lamp")이 실패 : 진짜 Caused byorg.hibernate.QueryException: could not resolve property: class of: xxx.yyy.LampEntity [SELECT lamp FROM xxx.yyy.LampEntity lamp WHERE lamp.location.code = :locationCode AND TYPE(lamp.location) = Room]

  • 재산 class 명확하게 여기라는 이름으로, 내가 유효성 검사의 몇 가지를 실행 (아래의 요청이 그냥 구문의, 완전히 functionnaly 잘못)입니다 같은 스택 트레이스

    @Query("SELECT lamp FROM Lamp lamp WHERE lamp.location.code = :code AND lamp.location.class = Room") 확인을 올바르게, 예상되는 결과는

    내가 새로운 저장소를 생성 (룸의 위치를 ​​램프 만)을 반환 작품 public interface LocationRepository extends JpaRepository<LocationEntity, Long> 및 테스트 :

    @Query("SELECT location FROM Location location WHERE TYPE(location) = Room AND location.code = :code") 정상적으로 작동합니다.

    Hibernate (또는 JPA?)가 TYPE이나 HQL 요청의 속성을 허용하지 않기 때문에 lamp.location.class (Hibernate specific :()과 함께 갈 것입니다. 상속되지 않은 엔티티 로직이 하나).

    이 답변에 대한 보완 또는 보정이 있으면 알려 주시기 바랍니다.

  • 1

    당신이 봄 JPA 저장소를 사용하는 경우,이 같은 방법을 이름을 변경하여 @Query없이이 작업을 수행 할 수 있습니다

    public List<LampEntity> findByLocation_Code(@Param("code") String locationCode); 
    

    ters 및 getters가 제 위치에 있습니다.

    +0

    예.하지만이 경우 잘못된 결과가 나타납니다. 실제로,'code' 고유의 제약은 추상 구현 클래스와 관련이 있습니다. 추상 클래스는 아닙니다. 같은 코드로'Floor'와'Room'을 가질 수 있습니다. – matiou

    +0

    또한'Location' 테이블에'type' 필드가 있습니다. –

    +0

    아니요.'Location' 엔티티에는'type' 필드도없고'@ DiscriminatorColumn'도 없습니다. 그런데'Location'은 단지 추상적 인 Entity이고 테이블은 없습니다. – matiou

    관련 문제