【问题标题】:hibernate query for list<t> in where clause在 where 子句中对 list<t> 进行休眠查询
【发布时间】:2015-12-20 13:24:05
【问题描述】:

我在 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)

【问题讨论】:

  • 你有堆栈跟踪什么的吗?当前的行为是什么?
  • 我用错误消息@Alexandre 更新了问题

标签: java spring hibernate spring-mvc


【解决方案1】:

重点是To 是一个集合。按集合元素的条件过滤的最常用方法是先加入它:

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

【讨论】:

    【解决方案2】:

    试试from Task where To.Id IN (:userid)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多