2017-02-05 2 views
0

Wir haben mehrere Modelle wie unten.Winterschlaf benutzerdefinierte benutzerdefinierte Felder Auswahl

@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; 


} 

Automodell

@Entity 
@Cacheable 
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Car { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public int id; 

    @Column(nullable = false, columnDefinition = "text") 
    private String name; 

    @Column(nullable = false, unique = true) 
    public String plateNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    public Person person; 

    @ManyToOne(fetch = FetchType.LAZY) 
    public Fabric fabric; 

} 

Stoff Modell

@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; 
} 

Das Problem ist, verwenden wir nur einige Attribute des Modells auf verschiedenen Modulen. Es ist in Ordnung, wenn wir einfache typisierte Attribute aufrufen, aber wenn wir so etwas abfragen;

session.createQuery("select name, cars from Person order by registration desc "); 

wir erhalten Fehler. Kann jemand helfen?

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) 
+0

Können Sie die vollständige Stack-Trace bereitstellen, so dass wir die Ursache sehen? – Naros

+0

Fügen Sie auch die Car-Entity-Code –

+0

@MaciejKowalski Ich habe Upload-Modelle – raigeki

Antwort

0

Geben Sie cars nicht als ein Feld in Ihrer Abfrage an.

Try LEFT JOIN FETCH Klausel, Personenentität mit zugehöriger Sammlung hinzufügen, die in einzelner Abfrage geladen werden, verbunden ist:

SELECT p.name FROM Person p LEFT JOIN FETCH p.cars ORDER BY p.registration DESC 
+1

Dies löst nicht das Problem des OP, nur bestimmte Spalten als Teil der Ergebnismengen zu holen. – Naros

+0

Richtig, ich habe die Antwort aktualisiert. – freedev

+0

Und das Ergebnis Ihrer Bearbeitung gibt nur den Namen, nicht den Namen ~ und ~ die Sammlung von Autos, wie sie wollen. – Naros

0

JPA unterstützt nicht tun, was Sie fragen, zumindest nicht über den Weg, den Sie versuche zu nehmen. Aber wenn Sie das Problem aus der Perspektive der Car nähern, können Sie.

SELECT c, c.person.name FROM Car c ORDER BY c.person.registration DESC 

Wenn Sie das Ergebnis in ein Wert-Objekt automatisch stopfen möchten, können Sie die SELECT NEW Syntax verwenden, oder Sie können die PPV CriteriaBuilder#construct Methode verwenden.

SELECT NEW MyValueObject(c, c.person.name) 
FROM Car c 
ORDER BY c.person.registration DESC 

könnten Sie die List<MyValueObject> mit Java Stream-API und Gruppe in Kombination nehmen dann die Ergebnisse, wie Sie im Speicher wollen, wenn dies erforderlich ist.

verstehen, dass das Ergebnis setzen Sie erhalten enthält:

  • A Car Instanz
  • A String Instanz, die die Person den Namen Wert enthält.

UPDATE

Um eine Karte zugeordnet Car zu bauen, würde ich wahrscheinlich hinzufügen, wahrscheinlich auf die MyValueObject, falls die c.person.id als eine andere Konstruktor Argument übergeben Sie Situationen führen, in denen Sie zwei Personen mit der haben gleicher Name.

List<MyValueObject> queryResults = query.getResultList(); 
List<List<MyValueObject>> groupedResults = queryResults 
    .stream() 
    .collect(Collectors.groupingBy(MyValueObject::getPersonId)) 
    .values(); 

Jeder Eintrag in groupedResults ist die Liste der Car Instanzen zugeordnet einer bestimmten Person als MyValueObject Instanz eingewickelt.

+0

Ich muss den Personennamen mit seinen Autos als Sammlung auflisten – raigeki

0

Sie können dies versuchen ...

session.createQuery("Select ps.name from Person as ps JOIN FETCH ps.cars ORDER BY ps.registration DESC"); 
Verwandte Themen