Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa JPQL连接两个表并添加参数会生成eclipseLink错误_Jpa_Jakarta Ee_Eclipselink_Jpql - Fatal编程技术网

Jpa JPQL连接两个表并添加参数会生成eclipseLink错误

Jpa JPQL连接两个表并添加参数会生成eclipseLink错误,jpa,jakarta-ee,eclipselink,jpql,Jpa,Jakarta Ee,Eclipselink,Jpql,所以。。我有两个表Usilizateur和ResponseStickets(插入、选择、更新和删除每个表本身都没有问题),为了在这两个表之间建立连接,我必须创建一个新的实体,这是它的代码 package projet.helpdesk.beans; import java.sql.Timestamp; //TEXTE - DATE_POST - NOM - PRENOM - AGENCE - POSTE - DEPARTEMENT - ID_EMPLOYE public class Joint

所以。。我有两个表Usilizateur和ResponseStickets(插入、选择、更新和删除每个表本身都没有问题),为了在这两个表之间建立连接,我必须创建一个新的实体,这是它的代码

package projet.helpdesk.beans;
import java.sql.Timestamp;
//TEXTE - DATE_POST - NOM  - PRENOM - AGENCE - POSTE - DEPARTEMENT - ID_EMPLOYE
public class Jointure1 {
private String texte;
private String nom;
private String prenom;
private String Agence;
private String poste;
private String departement;
private int id_employe;
private Timestamp date_post;

public String getTexte() {
    return texte;
}
public void setTexte(String texte) {
    this.texte = texte;
}
public String getNom() {
    return nom;
}
public void setNom(String nom) {
    this.nom = nom;
}
public String getPrenom() {
    return prenom;
}
public void setPrenom(String prenom) {
    this.prenom = prenom;
}
public String getAgence() {
    return Agence;
}
public void setAgence(String agence) {
    Agence = agence;
}
public String getPoste() {
    return poste;
}
public void setPoste(String poste) {
    this.poste = poste;
}
public String getDepartement() {
    return departement;
}
public void setDepartement(String departement) {
    this.departement = departement;
}
public int getId_employe() {
    return id_employe;
}
public void setId_employe(int id_employe) {
    this.id_employe = id_employe;
}
public Timestamp getDate_post() {
    return date_post;
}
public void setDate_post(Timestamp date_post) {
    this.date_post = date_post;
}

}
这就是我试图翻译成JPQL的SQL指令

SELECT u.nom, u.prenom, r.texte, r.date_post
FROM Utilisateur u, ReponseTicket r
WHERE u.id_emp = r.id_employe
AND r.id_ticket = ? ( parameter here )
这是DAO模式中的方法

    private static final String PARAM_TICKET           = "id_ticket";
    private static final String JPQL_SELECT ="SELECT u.nom, u.prenom, r.texte, r.date_post FROM Utilisateur u JOIN ReponseTicket r ON u.id_emp = r.id_employe AND r.id_ticket=:id_ticket";
    //^ Above is the JPQL instruction, not sure if it's correct.

    @PersistenceContext( unitName = "bdd_helpdesk_PU" )
    private EntityManager       em;

public List<Jointure1> trouverJointure( int id_ticket ) throws DAOException {
        List<Jointure1> liste;
        TypedQuery<Jointure1> query = em.createQuery(JPQL_SELECT, Jointure1.class);
        query.setParameter(PARAM_TICKET, id_ticket);
        try {
            liste = (List<Jointure1>) query.getResultList();
        } catch ( NoResultException e ) {
            return null;
        } catch(Exception e) {
            throw new DAOException(e);
        }
        return liste;
    }
我不知道空指针异常,参数id_ticket在URL中可见。 但是,我没有在persistence.xml中添加新实体

http://localhost:4040/monprojet2/reponsesticket?id_ticket=62
这是servlet

   package projet.helpdesk.servlets;


@WebServlet(urlPatterns={"/reponsesticket"})
public class Reponsestickets extends HttpServlet {

    @EJB
    private TicketDao ticketDao;

    @EJB
    private ReponseTicketDao reponseDao;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        CreationTicketForm ticketform = new CreationTicketForm(ticketDao);
        Ticket ticket = ticketform.recupererTicket(request);

        CreationReponseForm reponse = new CreationReponseForm(reponseDao);
        List<Jointure1> listereponse = reponse.recupererJointure(request);

        if(ticket==null)
        {
        response.sendRedirect("/connexion");
        } else {
            request.setAttribute("lreponse", listereponse);
            request.setAttribute("ticket", ticket);
            this.getServletContext().getRequestDispatcher("/WEB-INF/ReponsesTickets.jsp").forward(request, response);
        }
    }
}

由于Usilizateur和ResponseTicket之间没有关系,因此您不能在JPQL中“加入”它们!如果你只是在里面加个逗号而不是“JOIN”。。。就像JPA一样spec@NeilStockton您好。。你能说得更具体些吗?就像重写JPQL指令一样,它们之间自然没有关系,但我将通过公共属性“id_emp”和“id_employe”连接它们,我不需要将新Bean放在persistence.xml文件中。阅读JPQL参考文档。因此没有关系,因此不能使用“JOIN”。但是,您可以“从Class1 c1,Class2 c2”进行操作,您可以在JPA 2.1和更高版本中的任何适当的JPQL引用中找到,对于没有关系的实体,您可以在子句上加入
[2017-05-03T16:35:16.943+0100][glassfish 4.1][FINE][][org.eclipse.persistence.session./file:/C:/glassfish4/glassfish/domains/domain1/applications/monprojet2/WEB-INF/classes/\u bdd\u helpdesk\u PU.sql][tid:\u ThreadID=29\u ThreadName=http-listener-1(1)][timeMillis:1493825716943][levelValue:500][选择t0.nom、t0.prenom、t1.TEXTE、t1.DATE POST从usitateur t0、repostickets t1其中((t0.id_emp=t1.id_EMPLOYE)和(t1.id_TICKET=?)bind=>[62]]]
我明白了,现在SQL被调用并工作了,错误在JSP中,我更新了问题。
http://localhost:4040/monprojet2/reponsesticket?id_ticket=62
   package projet.helpdesk.servlets;


@WebServlet(urlPatterns={"/reponsesticket"})
public class Reponsestickets extends HttpServlet {

    @EJB
    private TicketDao ticketDao;

    @EJB
    private ReponseTicketDao reponseDao;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        CreationTicketForm ticketform = new CreationTicketForm(ticketDao);
        Ticket ticket = ticketform.recupererTicket(request);

        CreationReponseForm reponse = new CreationReponseForm(reponseDao);
        List<Jointure1> listereponse = reponse.recupererJointure(request);

        if(ticket==null)
        {
        response.sendRedirect("/connexion");
        } else {
            request.setAttribute("lreponse", listereponse);
            request.setAttribute("ticket", ticket);
            this.getServletContext().getRequestDispatcher("/WEB-INF/ReponsesTickets.jsp").forward(request, response);
        }
    }
}
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Réponses ticket</title>
<meta http-equiv="Content-Type" content="text/html">
<link type="text/css" rel="stylesheet" href="inc/style.css" />
</head>
<body>
<p>Test---> <br>votre id:${masession.idemp}<br>
Type:${masession.type}<br>
</p>
    <fieldset>
    <legend>Réponses pour ticket id: ${ticket.id_ticket}</legend><br>
    <p>Sujet:</p> ${ticket.sujet} <br>
    <p>Description:</p> ${ticket.description}<br>
    </fieldset>
    <br>
    <c:forEach items="${lreponse}" var="reponse">
        <p>Nom: ${reponse.nom}</p>
        <p>Prenom: ${reponse.prenom }</p>
        <p>Réponse: ${reponse.texte }</p>
        <p>Date: ${reponse.date_post }</p>
        <br><br>
    </c:forEach>

    <br><br><br>


    <fieldset>
    <legend>Répondre:</legend>
    <form method="post" action="creerreponse" enctype="application/x-www-form-urlencoded">
        <textarea rows="5" cols="36" name="texte"></textarea>${erreurs['texte']}<br/>
        <input type="hidden" name="id_employe" value="${masession.idemp}">
        <input type="hidden" name="id_ticket" value="${ticket.id_ticket}">
        <input type="hidden" name="type" value="${masession.type}">
        <input type="submit" value="Valider"><br/>
    </form>
    <p></p>
    </fieldset>
</body>
</html>
  [2017-05-03T16:47:49.790+0100] [glassfish 4.1] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=30 _ThreadName=http-listener-1(4)] [timeMillis: 1493826469790] [levelValue: 900] [[
  StandardWrapperValve[projet.helpdesk.servlets.Reponsestickets]: Servlet.service() for servlet projet.helpdesk.servlets.Reponsestickets threw exception
java.lang.NumberFormatException: For input string: "nom"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:378)
    at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:198)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:188)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1016)
    at org.apache.jsp.WEB_002dINF.ReponsesTickets_jsp._jspx_meth_c_forEach_0(ReponsesTickets_jsp.java:143)
    at org.apache.jsp.WEB_002dINF.ReponsesTickets_jsp._jspService(ReponsesTickets_jsp.java:85)