Jpa 使用JPQL选择实体时未调用SQL
我有一个表格FAQ(常见问题) 这是豆子:Jpa 使用JPQL选择实体时未调用SQL,jpa,jakarta-ee,ejb,eclipselink,jpql,Jpa,Jakarta Ee,Ejb,Eclipselink,Jpql,我有一个表格FAQ(常见问题) 这是豆子: package projet.helpdesk.beans; import javax.persistence.*; @Entity @Table(name="faq") public class FAQ { @Id private int id_qr; private int id_technicien; private String question; private String reponse
package projet.helpdesk.beans;
import javax.persistence.*;
@Entity
@Table(name="faq")
public class FAQ {
@Id
private int id_qr;
private int id_technicien;
private String question;
private String reponse;
public int getId_qr() {
return id_qr;
}
public void setId_qr(int id_qr) {
this.id_qr = id_qr;
}
public int getId_technicien() {
return id_technicien;
}
public void setId_technicien(int id_technicien) {
this.id_technicien = id_technicien;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getReponse() {
return reponse;
}
public void setReponse(String reponse) {
this.reponse = reponse;
}
}
这是DAO类:
函数public List chargerFAQ()
应该返回常见问题列表。
JPQL查询是:private static final String JPQL\u SELECT\u ALL=“SELECT f FROM FAQ f”代码>
`package projet.helpdesk.dao;
导入java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.NoResultException;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
导入projet.helpdesk.beans.FAQ;
@无国籍
公共类FAQDao{
私有静态最终字符串JPQL\u SELECT\u ALL=“从FAQ f中选择f”;
私有静态最终字符串JPQL\u SELECT\u QR=“从FAQ f中选择f,其中id\u QR=:id\u QR”;
私有静态最终字符串参数=“id\u qr”;
@PersistenceContext(unitName=“bdd\U帮助热线\U PU”)
私人实体管理者;
public void creer(常见问题解答)抛出IllegalArgumentException、DAOException{
试一试{
em.persist(常见问题);
}捕获(例外e){
抛出新的异常(e);
}
}
公共列表chargerFAQ()引发异常{
列出常见问题;
Query Query=em.createQuery(JPQL\u SELECT\u ALL);
试一试{
ListFaq=(List)query.getResultList();
}捕获(noresulte异常){
返回null;
}捕获(例外e){
抛出新的异常(e);
}
返回列表FAQ;
}
公共常见问题解答trouverQR(int id\U qr)引发异常{
常见问题解答;
Query Query=em.createQuery(JPQL\u SELECT\u QR);
query.setParameter(参数,id\u qr);
试一试{
qr=(FAQ)query.getSingleResult();
}捕获(noresulte异常){
返回null;
}捕获(例外e){
抛出新的异常(e);
}
返回qr;
}
}
`
持久化FAQ实体成功,但加载数据不会返回任何内容,可能是查询指令错误
下面是servlet:
`@WebServlet ( urlPatterns = { "/afficherfaq" })
public class AfficherFaq extends HttpServlet {
@EJB
private FAQDao faqDao;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.getServletContext().getRequestDispatcher("/WEB-INF/ChargerFaq.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<FAQ> lfaq = faqDao.chargerFAQ();
request.setAttribute("lfaq", lfaq);
this.getServletContext().getRequestDispatcher("/WEB-INF/ChargerFaq.jsp").forward(request, response);
}
}
`@WebServlet(urlPatterns={”/afficherfaq})
公共类AfficherFaq扩展了HttpServlet{
@EJB
私人发夹;
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
this.getServletContext().getRequestDispatcher(“/WEB-INF/ChargerFaq.jsp”).forward(请求,响应);
}
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
List lfaq=faqDao.chargerFAQ();
setAttribute(“lfaq”,lfaq);
this.getServletContext().getRequestDispatcher(“/WEB-INF/ChargerFaq.jsp”).forward(请求,响应);
}
}
`
实体的路径包含在persistence.xml文件中
编辑:添加了JSP代码。
显示结果的JSP文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link type="text/css" rel="stylesheet" href="inc/style.css" />
<title>Foire aux questions</title>
</head>
<body>
Test
<c:forEach items="${lfaq}" var="faq" varStatus="boucle">
<fieldset>
<p><span class="info">Question:</span></p><br>
<p>${faq.question}</p><br>
<p><span class="info">Reponse:</span></p><br>
<p>${faq.reponse}</p><br>
</fieldset><br><br>
</c:forEach>
</body>
</html>
附加问题
试验
问题:
${faq.question}
回复:
${faq.response}
“持久化FAQ实体成功”-它没有出现异常,但也没有做任何事情。更改(persist、merge、delete等)仅在有刷新调用或事务提交时与数据库同步,因此不会发生任何事情。而更改通常只有在事务提交后才可见。将您的方法包装到事务中。很抱歉,我正在尽我最大的努力理解您的评论,实际上与我发布的代码类似,在那里我添加了jsp代码,无法理解您所说的事务是什么意思。请参阅,其中描述了JPA如何使用事务,以及它们是数据库操作的基础。如果您的操作未参与事务,JPA将不会向数据库写入任何内容。不,EclipseLink/JPA不会为您处理事务。如果它在其他地方工作,那么您必须使用JTA并让容器在事务中包装内容。如果有疑问,请调用em.flush,如果它不在事务中,JPA将抛出异常。今天我学到了一些东西。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link type="text/css" rel="stylesheet" href="inc/style.css" />
<title>Foire aux questions</title>
</head>
<body>
Test
<c:forEach items="${lfaq}" var="faq" varStatus="boucle">
<fieldset>
<p><span class="info">Question:</span></p><br>
<p>${faq.question}</p><br>
<p><span class="info">Reponse:</span></p><br>
<p>${faq.reponse}</p><br>
</fieldset><br><br>
</c:forEach>
</body>
</html>