Как я могу использовать HibernateTemplate.findByNamedParam ()? - PullRequest
0 голосов
/ 15 сентября 2010

Привет, я пытаюсь использовать вышеупомянутый метод весеннего спящего режима temnplate сделать простой запрос на основе определенного идентификатора из базы данных, но проблема в том, что запрос не заменяет символ ":" из строки 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;
    }

}

Исключение, которое я получаю, в основном таково:

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";

ура заранее

1 Ответ

2 голосов
/ 15 сентября 2010

Вы должны дать параметру имя, а не просто двоеточие:

where id = :id

Кроме того, не используйте LIMIT - используйте template.setMaxResults()

На самом деле, я бы посоветовалза использование hibernate Session напрямую - HibernateTemplate - это то, что ребята из Hibernate много критикуют - смотрите здесь комментарии Gaving King .

Вы все еще можете использовать HibernateTemplate, но для функций (например, setFirstResult(..)) вы можете использовать Session.

Наконец, я думаю, что использование EntityManager - лучший выбор.Spring также предлагает очень хорошую интеграцию с JPA.

...