当我将 WHERE 子句放入 objectDB 时,UPDATE 命令出现问题
I have a problem with an UPDATE command when i put the WHERE clause it's crash in objectDB
我需要存储某个学生的实验室分数,第一个 Select 工作正常但是当我尝试使用 WHERE 子句更新 lab_points 的新值时程序崩溃。当我跳过 WHERE 程序时 运行 很好,但所有值都已更改。
更新会有什么问题?
EntityManagerFactory emf = (EntityManagerFactory)getServletContext().getAttribute("emf");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
EntityManager updateEm = emf.createEntityManager();
String nume, prenume;
int lab_points;
for(List<String> linie: linesAsList)
if(linie.get(1).matches("[a-zA-Z- ]+") && linie.get(2).length()>=2) {
nume = linie.get(1).split(" ")[0];
prenume = linie.get(1).split(" ")[1];
lab_points = (Integer) em.createQuery("select n.lab_points from Record as n where n.student.nume=:nume and n.student.prenume=:prenume and n.student.grupa=:grupa and n.cours.numeCurs=:curs")
.setParameter("nume", nume).setParameter("prenume", prenume)
.setParameter("grupa",linie.get(2)).setParameter("curs","Programare avansata").getSingleResult();
lab_points = lab_points + Integer.parseInt(linie.get(3).trim());
System.out.println(lab_points);
updateEm.getTransaction().begin();
updateEm.createQuery("update Record as n set n.lab_points=:points where n.student.nume=:nume").setParameter("nume",nume)
.setParameter("points",lab_points)
.executeUpdate();
updateEm.getTransaction().commit();
System.out.println(em.createQuery("select n.lab_points from Record as n where n.student.nume=:nume and n.student.prenume=:prenume and n.student.grupa=:grupa and n.cours.numeCurs=:curs")
.setParameter("nume", nume).setParameter("prenume", prenume)
.setParameter("grupa", linie.get(2)).setParameter("curs", "Programare avansata").getSingleResult());
}
if (updateEm.getTransaction().isActive())
updateEm.getTransaction().rollback();
updateEm.close();
if (em.getTransaction().isActive())
em.getTransaction().rollback();
em.close();
这是我的数据库错误消息:error
JPQL 不允许像
这样的语句
n.student.nume
在 UPDATE 语句中,因为它会尝试转换为 SQL JOIN,这在 UPDATE 语句中是不允许的。不幸的是,JPQL 不支持 UPDATE 语句中的子查询。
所以唯一的解决方案是将 student_id 映射到记录实体
中的 属性
@Column(name = "student_id", insertable=false, updatable=false)
private Long authorId;
并将任务分成两个查询,如下所示:
List<Long> ids = em.createQuery("SELECT s.id FROM Student s WHERE s.nume = :nume", Long.class)
.setParameter("nume", nume)
.getResultList();
em.createQuery("UPDATE Record r SET r.lab_points = :points WHERE b.student_id IN :ids")
.setParameter("ids", ids)
.setParameter("points",lab_points)
.executeUpdate();
我需要存储某个学生的实验室分数,第一个 Select 工作正常但是当我尝试使用 WHERE 子句更新 lab_points 的新值时程序崩溃。当我跳过 WHERE 程序时 运行 很好,但所有值都已更改。
更新会有什么问题?
EntityManagerFactory emf = (EntityManagerFactory)getServletContext().getAttribute("emf");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
EntityManager updateEm = emf.createEntityManager();
String nume, prenume;
int lab_points;
for(List<String> linie: linesAsList)
if(linie.get(1).matches("[a-zA-Z- ]+") && linie.get(2).length()>=2) {
nume = linie.get(1).split(" ")[0];
prenume = linie.get(1).split(" ")[1];
lab_points = (Integer) em.createQuery("select n.lab_points from Record as n where n.student.nume=:nume and n.student.prenume=:prenume and n.student.grupa=:grupa and n.cours.numeCurs=:curs")
.setParameter("nume", nume).setParameter("prenume", prenume)
.setParameter("grupa",linie.get(2)).setParameter("curs","Programare avansata").getSingleResult();
lab_points = lab_points + Integer.parseInt(linie.get(3).trim());
System.out.println(lab_points);
updateEm.getTransaction().begin();
updateEm.createQuery("update Record as n set n.lab_points=:points where n.student.nume=:nume").setParameter("nume",nume)
.setParameter("points",lab_points)
.executeUpdate();
updateEm.getTransaction().commit();
System.out.println(em.createQuery("select n.lab_points from Record as n where n.student.nume=:nume and n.student.prenume=:prenume and n.student.grupa=:grupa and n.cours.numeCurs=:curs")
.setParameter("nume", nume).setParameter("prenume", prenume)
.setParameter("grupa", linie.get(2)).setParameter("curs", "Programare avansata").getSingleResult());
}
if (updateEm.getTransaction().isActive())
updateEm.getTransaction().rollback();
updateEm.close();
if (em.getTransaction().isActive())
em.getTransaction().rollback();
em.close();
这是我的数据库错误消息:error
JPQL 不允许像
这样的语句n.student.nume
在 UPDATE 语句中,因为它会尝试转换为 SQL JOIN,这在 UPDATE 语句中是不允许的。不幸的是,JPQL 不支持 UPDATE 语句中的子查询。
所以唯一的解决方案是将 student_id 映射到记录实体
中的 属性@Column(name = "student_id", insertable=false, updatable=false)
private Long authorId;
并将任务分成两个查询,如下所示:
List<Long> ids = em.createQuery("SELECT s.id FROM Student s WHERE s.nume = :nume", Long.class)
.setParameter("nume", nume)
.getResultList();
em.createQuery("UPDATE Record r SET r.lab_points = :points WHERE b.student_id IN :ids")
.setParameter("ids", ids)
.setParameter("points",lab_points)
.executeUpdate();