英文:
Using BETWEEN in native query in JPQL
问题
我尝试使用JPQL中的BETWEEN
来进行查询,我已经在SQL中进行了测试,它是有效的,但是当我在JPQL中实现时,出现了错误:
Caused by: javax.persistence.PersistenceException:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException:
Incorrect syntax near ':'.
Error Code: 102"
我不明白为什么在:
附近会出现错误,有人可以帮我解决吗?
以下是我的代码:
public List<Object[]> reportPendapatan(String tahun) {
String tahun1 = tahun + "-01-01";
String tahun2 = tahun + "-12-31";
return em.createNativeQuery("SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk FROM Pendaftaran p, Murid m, pengajian pg, Guru g WHERE p.id_murid = m.id_murid and p.tanggal between :tahun and :tahun2 and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter("tahun", tahun1)
.setParameter("tahun2", tahun2)
.getResultList();
}
英文:
I tried to make a query using BETWEEN
in JPQL, I already tested it in SQL and it works, but when I implemented in JPQL I got an error:
Caused by: javax.persistence.PersistenceException:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException:
Incorrect syntax near ':'.
Error Code: 102"
I don't understand why there is the error near :
, can anybody help me figure it out?
Here is my code:
public List<Object[]> reportPendapatan(String tahun) {
String tahun1 = tahun +"-01-01";
String tahun2 = tahun +"-12-31";
return em.createNativeQuery("SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk FROM Pendaftaran p, Murid m, pengajian pg, Guru g WHERE p.id_murid = m.id_murid and p.tanggal between :tahun and :tahun2 and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter("tahun", tahun1)
.setParameter("tahun2", tahun2)
.getResultList();
}
答案1
得分: 1
根据这个答案,EclipseLink在使用本地查询时设置命名参数的语法略有不同,使用?
前缀而不是:
。
public List<Object[]> reportPendapatan(String tahun) {
String tahun1 = tahun + "-01-01";
String tahun2 = tahun + "-12-31";
return em.createNativeQuery(
"SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk "
+ "FROM Pendaftaran p, Murid m, pengajian pg, Guru g "
+ "WHERE p.id_murid = m.id_murid and p.tanggal between ? and ? "
+ "and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter(1, tahun1)
.setParameter(2, tahun2)
.getResultList();
}
另一种选择是使用_位置参数_1和2来表示tahun1
和tahun2
:
// ...
return em.createNativeQuery(
"SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk "
+ "FROM Pendaftaran p, Murid m, pengajian pg, Guru g "
+ "WHERE p.id_murid = m.id_murid and p.tanggal between ? and ? "
+ "and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter(1, tahun1)
.setParameter(2, tahun2)
.getResultList();
英文:
According to this answer, EclipseLink has slightly different syntax of setting named parameters in native queries using ?
prefix instead of :
public List<Object[]> reportPendapatan(String tahun) {
String tahun1 = tahun +"-01-01";
String tahun2 = tahun +"-12-31";
return em.createNativeQuery(
"SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk "
+ "FROM Pendaftaran p, Murid m, pengajian pg, Guru g "
+ "WHERE p.id_murid = m.id_murid and p.tanggal between ?tahun and ?tahun2 "
+ "and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter("tahun", tahun1)
.setParameter("tahun2", tahun2)
.getResultList();
}
Other option is to use positional parameters 1 and 2 for tahun1
and tahun2
respectively:
// ...
return em.createNativeQuery(
"SELECT p.tanggal, m.nama, pg.nama_jenis, g.nama_guru,pg.harga_masuk "
+ "FROM Pendaftaran p, Murid m, pengajian pg, Guru g "
+ "WHERE p.id_murid = m.id_murid and p.tanggal between ? and ? "
+ "and p.id_guru = g.id_guru and p.id_jenis = pg.id_jenis and p.status=4")
.setParameter(1, tahun1)
.setParameter(2, tahun2)
.getResultList();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论