2014-05-21 4 views
0

다음 엔터티 클래스가 있습니다 : 사용자 및 범주. 사용자는 여러 범주를 가질 수 있습니다. 특정 이메일과 카테고리를 가져온 사용자를 선택하려면 쿼리를 작성해야합니다.이 값은 업데이트 값이 지정된 것보다 큽니다.최대 절전 모드, OneToMany 연결 - 선택 문제

불행히도, 나는 (내 관점에서) 이상한 오류가 발생합니다.

String selectQuery = "from User as user left outer join user.categories as category with category.updated >= :after where user.email = :email"; 
User u = (User)sessionFactory.getCurrentSession().createQuery(selectQuery). 
      setString("email", email). 
      setCalendar("after", after). 
      setResultTransformer(RootEntityResultTransformer.INSTANCE). 
      uniqueResult(); 
return u; 

나는 또한이 쿼리 시도했다 : :

java.lang.ClassCastException: Category cannot be cast to User 

아무도 어떤 단서가 있습니까 :

String selectQuery = "from User as user left outer join user.categories as category where category.updated >= :after and user.email = :email"; 

내가 오류 메시지를 여기에 쿼리입니까? 오류 메시지가 나에게 이상한 것 같습니다. 사용자가 아닌 범주에서 선택했기 때문입니다. P.S 물론 사용자가 범주를 전혀 갖고 있지 않으면 쿼리가 작동해야합니다.

다음은 엔티티 :

@Entity 
@Table(name = "USER", uniqueConstraints = { 
     @UniqueConstraint(columnNames = {"EMAIL"}) 
}) 
public class User extends AbstractTimestampEntity implements Serializable { 

    public User() { 

    } 

    private Integer id; 

    private String email; 

    private Set<Category> categories = null; 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 

    @NotEmpty 
    @Email 
    @Column(name = "EMAIL") 
    public String getEmail() { 
     return email; 
    } 

    @Cascade({ org.hibernate.annotations.CascadeType.PERSIST }) 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    public Set<Category> getCategories() { 
     return categories; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public void setCategories(Set<Category> categories) { 
     this.categories = categories; 
    } 
} 


@Entity 
@Table(name = "CATEGORY") 
public class Category extends AbstractTimestampEntity implements Serializable { 

    private Integer id; 

    private User user; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", unique = true, nullable = false) 
    public Integer getId() { 
     return id; 
    } 

    @NotNull 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "USER_ID") 
    public User getUser() { 
     return user; 
    } 


    public void setId(Integer id) { 
     this.id = id; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 
} 

@MappedSuperclass 
public class AbstractTimestampEntity { 

    private Calendar created; 

    private Calendar updated; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "CREATED") 
    public Calendar getCreated() { 
     return created; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "UPDATED") 
    public Calendar getUpdated() { 
     return updated; 
    } 

    public void setCreated(Calendar created) { 
     this.created = created; 
    } 

    public void setUpdated(Calendar updated) { 
     this.updated = updated; 
    } 
} 

미리 감사드립니다. 도움을 주시면 감사하겠습니다.

+0

개체 코드가 도움이 될 것 같습니다 ... –

+0

'User' 및'Category' 클래스를 게시 할 수 있습니까? – Rohan

+0

여기 있습니다. 내 질문에 관심을 가져 주셔서 감사합니다. – user3489820

답변

1

옵션은 항상 사용자의 모든 범주를 검색하고 당신이 자바를 필터링해야 할 것 "FETCH"

String selectQuery = 
      "from User as user " + 
      "left join fetch user.categories as category " + 
      "where " + 
      " user.email = :email"; 
User user = (User) session.createQuery(selectQuery). 
     setString("email", email). 
     uniqueResult(); 
return user; 
//then filter the user.categories by the after criteria 

범주이 쿼리를 필터링 할 수없는, 왼쪽 가입 이후 fetch를 사용하면 where 절에서 별칭을 사용할 수 없습니다.

더 효율적인 쿼리를 사용하려면 "FETCH"를 실행해야하며이 방법으로 카테고리를 필터링 할 수도 있지만 이번에는 자신의 "부분적인"뷰를 가진 사용자를 검색 할 수 없습니다 카테고리. 모든 하위 항목을 가져 오거나 하나도 가져 오지 않습니다.

String selectQuery = 
      "select user, category " + 
      "from User as user " + 
      "left join user.categories as category with category.updated >= :after " + 
      "where " + 
      " user.email = :email"; 
List userAndCategories = session.createQuery(selectQuery). 
     setString("email", email). 
     setCalendar("after", after). 
     list();  
//userAndCategories contains Object[] entries where the User is the Object[0] is the user and Object[1] is the Category 
+0

답변 해 주셔서 감사합니다. 내 코드에서 해보겠습니다. – user3489820

+0

안녕하십니까. 두 접근법을 모두 점검하고 현재 문제 상황에 맞는 접근법을 확인하십시오. 전자는 통합하기가 쉽지만 후자는 더 잘 수행해야합니다. –

관련 문제