문제

배경

열이 있는 테이블이 있습니다. id, imageId, propertyId.

단일 속성과 연결된 많은 이미지가 있을 수 있고 단일 이미지와 연결된 많은 속성이 있을 수 있습니다.

imageId - many-to-many - propertyId

propertyId 목록이 있고 모든 propertyId와 관련된 모든 이미지를 찾고 싶습니다. 최대 절전 모드 사용.

문제.

지금은 한 번에 하나의 속성을 선택하고 Criteria API를 사용하여 이 propertyId와 연결된 모든 imageId를 찾아서 imageId 목록을 얻습니다.다음 쿼리에서 이 imageId 목록을 사용하여 다음과 같이 말합니다.

select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x

따라서 효과적으로 DB에 도달하는 쿼리 수는 propertyId 수와 동일합니다.나는 이것이 데이터베이스에 n 번 도달해야 하는 좋은 해결책이라고 생각하지 않습니다. Detached Query를 사용해 보았지만 성공하지 못했습니다.더 나은 해결책이 있습니까?

또한 최종적으로 imageId 목록을 얻었을 때 이를 사용자 세션에 저장하고 페이지를 매기는 것이 좋은 생각입니까(결과 수는 고려하지 않음) 아니면 전체 프로세스를 반복하는 것이 좋은 생각입니까 아니면 페이지 매김을 위해 DB에 저장하는 것을 고려합니까?

도움이 되었습니까?

해결책

데이터베이스 스키마에 문제가 있습니다.

3개의 개별 연관(이미지 - 컬렉션, 이미지 - 속성, 컬렉션 - 속성)을 하나의 연결로 밀어넣으려고 합니다. 이미지 컬렉션 테이블.이것은 좋은 일이 아닙니다.일반 SQL을 사용하면(해당 테이블에 null 열이 있는 많은 행을 사용하여) 이를 해결할 수 있지만 Hibernate에서는 이를 적절하게 매핑할 수 없습니다.그런데 이 테이블에는 대리 기본 키가 필요하지 않습니다.

당신이 해야 할 일은 그것을 3개의 개별 테이블로 분할하고 Hibernate에서 적절한 다대다로 모델을 매핑하는 것입니다.예를 들어:

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}

IMAGE_PROPERTIES 테이블에는 IMAGE_ID 그리고 PROPERTY_ID 기둥;당신은 할 것 COLLECTION_IMAGES 그리고 COLLECTION_PROPERTIES 테이블도 그냥 그런 것 같아요.

그러면 다음과 같은 속성 이름으로 이미지를 쿼리할 수 있습니다.

from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')

귀하의 속성이 실제로 태그와 유사하다면 다음을 살펴보십시오. 이 기사 AND/OR/UNION 쿼리 예시.

속성이 실제로 속성인 경우(즉, 소유자 엔터티의 수명 주기가 있고 동시에 두 개 이상의 엔터티에 속할 수 없음) 두 테이블(하나는 이미지용, 다른 하나는 컬렉션용)로 분할하고 하나를 사용하는 것이 좋습니다. 다수의 연관.그렇게 하면 너한테는 필요 없을 거야 IMAGE_PROPERTIES 그리고 COLLECTION_PROPERTIES 위에서 본 테이블.

다른 팁

따라서 이와 같은 클래스가 있습니다 (참고 : IDE와 함께 이것을 작성하지 않았으므로 코드가 구문 적으로 정확하지 않을 수 있습니다).

public class Property {
@ManyToMany
private List<Image> images;
}

public class Image {
@ManyToMany
private List<Property> properties;
}

그래서 쿼리가 좋아요 select property from Property property 일반적인 Java 속성을 통해 얻을 수있는 속성 목록을 얻을 수 있습니다.

그것이 당신이 찾고있는 것입니까, 아니면 질문을 오해 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top