- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我正在尝试使用上面的 spring hibernate 模板方法根据数据库中的特定 ID 进行简单查询,但问题是查询不会将下面 sql 字符串中的“:”字符替换为值包含在“id”中。
我认为这个方法用我在方法位中设置的给定参数替换了“:”,但事实并非如此?
代码如下:
private static final String SQL_GET_FILE = "select new FileObject(filename, size, id, type, file) from FileObject where id = : limit 1";
FileObject file = (FileObject) hbTemplate.findByNamedParam(SQL_GET_FILE, "id", id);
//文件对象POJO:
package com.kc.models;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.SQLException;
import org.hibernate.Hibernate;
public class FileObject {
private String filename;
private String type;
private double size;
private Blob file;
private int id;
public FileObject() {
}
public FileObject(String name, double size, int id, String type) {
this.filename = name;
this.type = type;
this.size = size;
this.id = id;
}
public FileObject(String name, double size, int id, String type, Blob file) {
this.filename = name;
this.type = type;
this.size = size;
this.id = id;
this.file = file;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFilename() {
return filename;
}
public void setFilename(String fileName) {
this.filename = fileName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getSize() {
return size;
}
public void setSize(double size) {
this.size = size;
}
public Blob getFile() {
return file;
}
public void setFile(Blob file) {
this.file = file;
}
}
我得到的异常(exception)基本上是这样的:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 1 near line 1, column 104 [select new FileObject(filename, size, id, type, file) from com.kc.models.FileObject where id = : limit 1]
org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)
org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)
org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258)
org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
org.springframework.orm.hibernate3.HibernateTemplate$31.doInHibernate(HibernateTemplate.java:949)
org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
org.springframework.orm.hibernate3.HibernateTemplate.findByNamedParam(HibernateTemplate.java:947)
org.springframework.orm.hibernate3.HibernateTemplate.findByNamedParam(HibernateTemplate.java:938)
com.kc.models.DbFileHelper.getFile(DbFileHelper.java:81)
com.kc.models.FileHelper.getFileFromDb(FileHelper.java:195)
com.kc.Controllers.DownloadAppController.handle(DownloadAppController.java:48)
org.springframework.web.servlet.mvc.AbstractCommandController.handleRequestInternal(AbstractCommandController.java:84)
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
现在我通过简单地执行上述操作暂时完成了快速修复
private static final String SQL_GET_FILE = "select new FileObject(filename, size, id, type, file) from FileObject where id = ";
List<FileObject> file = hbTemplate.find(SQL_GET_FILE+id);
但我不喜欢用 + 连接查询字符串的想法。
如果我有一个看起来像这样的sql,它会变得乏味:
SQL_GET_FILE = "select new FileObject(filename, size, id, type, file)
from FileObject where id = 10 && size < 1000 && type = jpg";
提前干杯
最佳答案
您应该给参数一个名称,而不仅仅是冒号:
where id = :id
另外,不要使用LIMIT
- 使用template.setMaxResults()
实际上,我建议直接使用 hibernate Session
- HibernateTemplate
是 Hibernate 的人批评很多的东西 - see here the comments by Gaving King .
您仍然可以使用 HibernateTemplate
,但对于功能(如 setFirstResult(..)
),您可以使用 Session
。
最后,我认为使用EntityManager
是最好的选择。 Spring 还提供了非常好的 JPA 集成。
关于java - 如何使用 HibernateTemplate.findByNamedParam()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3718000/
嗨,我正在尝试使用上面的 spring hibernate 模板方法根据数据库中的特定 ID 进行简单查询,但问题是查询不会将下面 sql 字符串中的“:”字符替换为值包含在“id”中。 我认为这个方
我见过很多关于如何使用一些非常简单的查询创建分页的示例。但我没有看到任何使用 HibernateTemplate 的 findByNamedParam 方法。 如何在使用 findByNamedPar
我是一名优秀的程序员,十分优秀!