2016-10-25 8 views
0

Я пытаюсь выполнить запрос на мой благородные предшественники сервера Вот мой запрос:Что не так с этим запросом JPQL?

List<Object> result = entityManager 
    .createQuery("SELECT post FROM PostMW post LEFT OUTER JOIN LikeMW likes ON post.id = likes.post_id AND likes.user_id =:userID") 
    .setParameter("userID", 1) 
    .setFirstResult(offset).setMaxResults(itemsPerPage) 
    .getResultList(); 

Объект PostMW (не полный, но с необходимыми данными, которые я бы сказал):

@Entity 
@Table(name="POST") 
public class PostMW{ 

    @Id 
    @Column(name="id", nullable=false) 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="media_id", nullable=false, unique=true) 
    private MediaMW media; 

    @Column(name="latitude", nullable=false) 
    private BigDecimal latitude; 

    @Column(name="longitude", nullable=false) 
    private BigDecimal longitude; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="challenge_id", nullable=false) 
    private ChallengeMW challenge; 

    // GETTERS AND SETTERS // 
    .... 
} 

Вот LikeMW (полный), так как вы видите, она имеет только два первичных ключей из таблицы USER и POST:

@Entity 
@Table(name="LIKES") 
public class LikeMW { 

    @Id 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "post_id", nullable=false) 
    @JsonBackReference 
    private PostMW post; 

    @Id 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="user_id", nullable=false) 
    private UserMW user; 

    // GETTERS AND SETTERS // 
    ... 
} 

Я получаю nullpointerEx ception! Я не могу понять, почему ... Исключение:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Internal problem encountered while compiling [SELECT post FROM PostMW post LEFT OUTER JOIN LikeMW likes ON post.id = likes.post_id AND likes.user_id =:userID]. 
Internal Exception: java.lang.NullPointerException 
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1605) 
at com.jonathan.myworld.model.dao.impl.PostDaoImpl.list(PostDaoImpl.java:72) 
at com.jonathan.myworld.service.impl.FeedServiceImpl.getFeed(FeedServiceImpl.java:45) 
at com.jonathan.myworld.UserWS.login(UserWS.java:151) 
at com.jonathan.myworld.UserWS.loginWithGoogle(UserWS.java:60) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:130) 
at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:363) 
at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113) 
at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366) 
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) 
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:511) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Internal problem encountered while compiling [SELECT post FROM PostMW post LEFT OUTER JOIN LikeMW likes ON post.id = likes.post_id AND likes.user_id =:userID]. 
Internal Exception: java.lang.NullPointerException 
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildUnexpectedException(HermesParser.java:207) 
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:296) 
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86) 
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603) 
... 49 more 
Caused by: java.lang.NullPointerException 
at org.eclipse.persistence.queries.DatabaseQuery.addArgument(DatabaseQuery.java:449) 
at org.eclipse.persistence.queries.DatabaseQuery.addArgument(DatabaseQuery.java:419) 
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.addArguments(HermesParser.java:98) 
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:287) 

Я не могу найти то, что я делаю неправильно. Любое предложение будет очень оценено!

EDIT:

Попытка этот запрос на данный момент:

List<Object> result = entityManager 
       .createQuery("SELECT post FROM PostMW post LEFT OUTER JOIN post.hasLiked liked ON post.id = liked.post_id AND liked.user_id =:userID") 
       .setParameter("userID", 1) 
       .setFirstResult(offset).setMaxResults(itemsPerPage) 
       .getResultList(); 

Обновленные мои объекты. Теперь мой PostMW объект имеет

@Entity 
@Table(name="POST") 
public class PostMW{ 
    ... 
    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="LIKES", [email protected](name="post_id"), [email protected](name="user_id")) 
    private List<UserMW> hasLiked; 
    ... 
} 

И UserMW имеет

@Entity 
@Table(name="USER") 
public class UserMW { 
    ... 
    @Id 
    @Column(name="id", nullable=false) 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(name="name", nullable=false, length=255) 
    private String name; 
    ... 
} 

Получение же исключение T.T

+0

Я предполагаю, что ваш EntityManager не установлен/введен правильно.См. Http://stackoverflow.com/questions/4708035/persistencecontext-entitymanager-injection-nullpointerexception – donlys

+0

@donlys Это потому, что все мои другие запросы работают нормально. –

ответ

0

Точно такая же ошибка была сообщена как ошибка в:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=394033

, а затем снова на GlassFish ошибок: https://java.net/jira/si/jira.issueviews:issue-html/GLASSFISH-20456/GLASSFISH-20456.html

Вы можете проверить, если вы используете версию EclipseLink с исправлением?

+0

Я использую EclipseLink 2.5.2. Это нормально? –

+0

В качестве одного из комментариев к ошибкам вы можете попробовать добавить <свойство name = "eclipselink.jpql.parser" value = "org.eclipse.persistence.queries.ANTLRQueryBuilder" /> – donlys

+0

к свойствам сохраняемости – donlys

0

Есть нулевой чек на объект EntityManager используется для вызова CreateQuery? Возможно, этот объект имеет значение null, и в этой строке создается исключение java.lang.NullPointerException.

+0

Я проверил уже, entityManager установлен успешно :( –

1

JPQL использует классы/поля, а не таблицы/столбцы. JPQL! = SQL

0

Ваш JPQL неверен. В JPQL нет JOIN...ON.

Поскольку у вас нет ссылки от Post к Like, вы можете инвертировать запрос на что-то вдоль линий

SELECT likes.post FROM LikeMW likes WHERE likes.user.id = :userID 

Что бы получить посты как пользователь с данным идентификатором пользователя ,

Вы также захотите добавить заказ по вашему запросу, если вы намерены использовать смещение/ограничение.

+0

@NeilStockton О, спасибо. – Kayaman

+0

Но в этом случае у меня будут только сообщения, которые понравился данному пользователю. Мое намерение - получить ВСЕ сообщения, но для каждого сообщения, которое я хочу есть что знать, понравился ли данному пользователю этот пост или нет. Пожалуйста, посмотрите мою проблему здесь: http://stackoverflow.com/questions/40218027/what-would-be-the-best-way- Благодарим вас за консультацию по заказу :) –

 Смежные вопросы

  • Нет связанных вопросов^_^