복붙노트

[SPRING] where 절에서리스트 <t>에 대한 최대 절전 쿼리

SPRING

where 절에서리스트 에 대한 최대 절전 쿼리

나는 Spring 애플리케이션에서 @ManyToMany 매핑 된 클래스를 사용했다. ID로 특정 사용자에게 할당 한 모든 태스크를 가져오고 싶다.

작업 클래스

public class Task {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="taskid")
private String TaskId;

@Column(name="subject")
private String Subject;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "jt_assign_tasksmap", joinColumns = { @JoinColumn(name = "taskid") }, inverseJoinColumns = { @JoinColumn(name = "assignedto_uid") })
private List<Users> To;

//getters and setters

}

사용자 클래스

public class Users {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "uid")
private String Id;


@Column(name = "username")
private String Username;


@ManyToMany(targetEntity=Task.class, mappedBy="To", fetch = FetchType.EAGER,  cascade=CascadeType.ALL)
@Fetch(FetchMode.SELECT)
private List<Task> assignedTo;

//getters and setters

}

이제 사용자의 모든 작업을 나열하려고합니다.

위 코드를 시도했지만 작동하지 않았습니다.

public List<Task> getAllOfMyTasks(String UserId) {
    List<String> Ids = new ArrayList<String>();
    Ids.add(UserId);
    return (List<Task>) sf.getCurrentSession().createQuery("from Task where To.Id = :userid").setParameterList("userid", Ids).list();
}

오류

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.QueryException: illegal attempt to dereference collection [{synthetic-alias}{non-qualified-property-ref}To] with element property reference [Id] [from com.nbtech.powertrac.model.Task where To.Id = :userid]

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.QueryException: illegal attempt to dereference collection [{synthetic-alias}{non-qualified-property-ref}To] with element property reference [Id] [from com.nbtech.powertrac.model.Task where To.Id = :userid]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

해결법

  1. ==============================

    1.요점은 To가 컬렉션이라는 것입니다. 콜렉션 요소에 대한 기준으로 필터링하는 가장 일반적인 방법은 먼저 콜렉션 요소에 참여하는 것입니다.

    요점은 To가 컬렉션이라는 것입니다. 콜렉션 요소에 대한 기준으로 필터링하는 가장 일반적인 방법은 먼저 콜렉션 요소에 참여하는 것입니다.

    select distinct t from Task t join t.To tto where tto.Id = :userid
    
  2. ==============================

    2.Task에서 To.Id (: userid)를 시도하십시오.

    Task에서 To.Id (: userid)를 시도하십시오.

  3. from https://stackoverflow.com/questions/32735968/hibernate-query-for-listt-in-where-clause by cc-by-sa and MIT license