【问题标题】:Java JPA query createQuery issueJava JPA查询createQuery问题
【发布时间】:2015-10-15 22:42:31
【问题描述】:

我正在学习 JPA,并且一直在学习教程。

教程项目是一个简单的“航班预订”动态站点,带有 JPA 和 derby 数据库。

我有一个带有 @Entity 注释的乘客类和一个作为无状态本地 bean 的乘客服务类。乘客服务类有一个 getPassengers 方法,它执行“createQuery("SELECT p FROM PASSENGER p",Passenger.class);"返回的结果是一个乘客列表。

要调用此方法,我有一个 GetPassenger servlet,并将查询结果列表设置为 http 请求属性并将其分派到 jsp 视图文件。

问题是,当我使用 getPassengers 方法运行 servlet 时,返回的列表是空的,即使我确保数据库的乘客表中有多个条目。以下是我的代码。感谢任何帮助。

谢谢。

客舱:

package com.airline.models;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.*;

/**
* Entity implementation class for Entity: Passenger
*
*/
@Entity

public class Passenger implements Serializable {
@Override
public String toString() {
    return "Passenger [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob
            + ", gender=" + gender + ", flightclass=" + flightclass + "]";
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String firstName;

private String lastName;

@Temporal(TemporalType.DATE)
private Date dob;

@Enumerated(EnumType.STRING)
private Gender gender;

@Enumerated(EnumType.STRING)
private FlightClass flightclass;

PassengerService 类:

package com.airline.service;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import com.airline.models.Flight;
import com.airline.models.Passenger;

/**
*  Session Bean implementation class PassengerService
*/
@Stateless
@LocalBean
public class PassengerService {

/**
 * Default constructor.
 */
public PassengerService() {
    // TODO Auto-generated constructor stub
}

@PersistenceContext(unitName = "airline")
EntityManager em;

public void addPassenger(Passenger p) {
    em.persist(p);
}

public List<Passenger> getPassengers() {
    try{

    TypedQuery<Passenger> query = em.createQuery("SELECT p FROM PASSENGER p",    Passenger.class);

    List<Passenger> pList = (List<Passenger>)query.getResultList();

    return pList;
    }
    catch (Exception e)
    {
        System.out.println("Passenger not found");
        return null;
    }
}
}

GetPassenger servlet:

package com.airline.controllers;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.ejb.EJB;
import javax.print.attribute.standard.PrinterState;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.airline.models.Flight;
import com.airline.models.Passenger;
import com.airline.service.FlightService;
import com.airline.service.PassengerService;

/**
* Servlet implementation class GetFlight
*/
@WebServlet("/GetPassenger")
public class GetPassenger extends HttpServlet {
private static final long serialVersionUID = 1L;


@EJB
PassengerService ps;
/**
 * @see HttpServlet#HttpServlet()
 */
public GetPassenger() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    List<Passenger> pList = (List<Passenger>)ps.getPassengers();

    request.setAttribute("Passenger_List", pList);

    if(pList == null)
    {
        System.out.println("passenger list empty");
        return;
    }

    RequestDispatcher view = request.getRequestDispatcher("WEB-INF/views/passenger_list.jsp");

    view.forward(request, response);


}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

【问题讨论】:

  • 当我说列表为空时,我的意思是在控制台上 public List getPassengers() 下的 try catch 块打印出“找不到乘客”和 servlet 的 if (pList== null) 将乘客列表打印为空。
  • 此外,这些类是我之前创建的 Flight、FlightService 和 GetFlight 的相同副本,它们执行完全相同的操作并从同一数据库不同的表中打印出航班列表。
  • 唯一的区别是我使用的 FlightService:TypedQuery fQuery = em.createNamedQuery("Flight.FindById", Flight.class);和@NamedQuery(name = "Flight.FindById", query = "SELECT f FROM Flight f WHERE f.id = :id") 结果正如预期的那样打印了航班列表。
  • 当您最终进入 catch 块并打印“乘客列表为空”时,异常是什么?这可能是您的线索,因为即使没有结果,您也不应该得到异常。调试该块以查看异常是什么,或执行 e.printStackTrace()
  • 引起:异常 [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.payara-p1):org.eclipse.persistence.exceptions.JPQLException 异常描述:编译问题 [SELECT p FROM PASSENGER p]。 [14, 23] 抽象模式类型“PASSENGER”未知。 ——这很奇怪。在名为 PASSENGER 的数据库下没有架构,一切都在架构“航空公司”下...?

标签: java servlets jpa


【解决方案1】:

设法通过将实际查询从“SELECT p FROM PASSENGER p”更改为“SELECT p FROM Passenger p”来修复它。

Passenger指的是实体类的名字而不是表的名字..?

【讨论】:

  • 是的,JPA 查询是针对您的实体类型和实体上的属性,而不是直接针对它们映射到的表和列
  • "乘客是指实体类的名称而不是表的名称..?" - 是的。 JPQL 不是 SQL。
  • 经过一番挖掘后,我意识到了这种差异......感谢您的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多