Java 休眠自定义多字段选择
我们有以下几种型号Java 休眠自定义多字段选择,java,spring,hibernate,hql,Java,Spring,Hibernate,Hql,我们有以下几种型号 @Entity @Cacheable @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Person { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public int id; @Column(nullable = false, columnDe
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int id;
@Column(nullable = false, columnDefinition = "text")
public String name;
@Column(nullable = false, unique = true)
public long ssid;
@Column(nullable = false)
public int age;
@Column(nullable = false)
public long registration;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "person")
@Cascade(CascadeType.ALL)
public List<Car> cars;
}
织物模型
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Fabric {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int id;
@Column(nullable = false, columnDefinition = "text")
public String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fabric")
@Cascade(CascadeType.ALL)
public List<Car> cars;
}
我们会犯错误。有人能帮忙吗
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
org.hibernate.loader.Loader.getResultSet(Loader.java:2123)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1911)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
org.hibernate.loader.Loader.doQuery(Loader.java:932)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
org.hibernate.loader.Loader.doList(Loader.java:2615)
org.hibernate.loader.Loader.doList(Loader.java:2598)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
org.hibernate.loader.Loader.list(Loader.java:2425)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:370)
org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1481)
org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1441)
org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)
org.hibernate.Query.getResultList(Query.java:427)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
com.sun.proxy.$Proxy88.getAllPostOverview(Unknown Source)
jarvis.api.story.PostController.getAllPostOverviews(PostController.java:51)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
不要将
cars
指定为查询中的字段
尝试添加LEFT JOIN FETCH
子句,将在单个查询中加载具有已加入的关联集合的个人实体:
SELECT p.name FROM Person p LEFT JOIN FETCH p.cars ORDER BY p.registration DESC
JPA不支持按照你的要求去做,至少不支持你试图走的路。但是如果您从
汽车的角度来处理问题,您可以
SELECT c, c.person.name FROM Car c ORDER BY c.person.registration DESC
如果要将此结果集自动填充到值对象中,可以使用selectnew
语法,也可以使用JPACriteriaBuilder#construct
方法
SELECT NEW MyValueObject( c, c.person.name )
FROM Car c
ORDER BY c.person.registration DESC
然后,您可以将列表
与Java Stream API结合起来,并根据需要在内存中对结果进行分组
只需了解您获得的结果集包含:
汽车
实例
- 一个
字符串
实例,其中包含人员
的名称值
更新
为了构建关联的Car
的映射,我可能会在MyValueObject
中添加传递c.person.id
作为另一个构造函数参数,以防遇到两个同名的人的情况
List<MyValueObject> queryResults = query.getResultList();
List<List<MyValueObject>> groupedResults = queryResults
.stream()
.collect( Collectors.groupingBy( MyValueObject::getPersonId ) )
.values();
List queryResults=query.getResultList();
List groupedResults=queryResults
.stream()
.collect(收集器.groupingBy(MyValueObject::getPersonId))
.values();
groupedResults
中的每个条目都是与给定的Person
关联的Car
实例列表,包装为MyValueObject
实例 你可以试试这个
session.createQuery("Select ps.name from Person as ps JOIN FETCH ps.cars ORDER BY ps.registration DESC");
你能提供完整的堆栈跟踪以便我们看到根本原因吗?还要添加Car实体code@MaciejKowalski我已经上传了关于erro的完整跟踪的模型,@raigeki?@Naros我上传了StackTraceth这并不能解决OP只想获取特定列作为结果集有效载荷的一部分的问题。而且编辑的结果只返回名称,而不是他们想要的名称~和~汽车集合。不,我已经尝试过了。简而言之,LEFT JOIN FETCH
避免了编译时指定的FETCH=FetchType.LAZY
,并强制加载汽车。我需要将人名和他/她的汽车列为集合
List<MyValueObject> queryResults = query.getResultList();
List<List<MyValueObject>> groupedResults = queryResults
.stream()
.collect( Collectors.groupingBy( MyValueObject::getPersonId ) )
.values();
session.createQuery("Select ps.name from Person as ps JOIN FETCH ps.cars ORDER BY ps.registration DESC");