当前位置: 首页 > 知识库问答 >
问题:

命名查询执行的通用实现

巢海
2023-03-14

我正在尝试实现一个泛型类(GenericDaoImpl)

我无法更改方法签名。

public abstract class GenericDaoImpl<T, E> implements GenericDao<T, E> {

    @PersistenceContext(unitName="MyUnit")
    protected EntityManager em;
    private Class<T> persistentClass;

    @SuppressWarnings("unchecked")
    public GenericDaoImpl() {
        this.persistentClass = getPersistentClass();
    }

    public void setPersistentClass(Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }

    public Class<T> getPersistentClass() {
        Class<?>[] typeArguments = TypeResolver.resolveRawArguments(GenericDao.class, getClass());
        this.persistentClass = (Class<T>) typeArguments[0];
        return persistentClass;
    }

    ....

    @Transactional
    public void save(T entity) {
        em.persist(entity);
    }

    @Transactional
    public void update(T entity) {
        em.merge(entity);
    }

    @Transactional
    public void delete(E id) {
        em.remove(em.find(persistentClass,id));
    }

    ...

    public List<T> findByNamedQuery(String queryName, Object... params) {
        Query q = this.em.createNamedQuery(queryName,persistentClass);
        for(int i =1;i<params.length-1;i++){
            q.setParameter(i, params[i]);
        }
        return (List<T>)q.getResultList();
    }

}

现在,给出这个命名查询:

@NamedQuery(name="Office.findByStreetAndCity",query="SELECT o from Office o JOIN o.address a WHERE a.street=:street AND a.city=:city"),

让我们执行以下方法:

String[] params= {"Mount Eden Road", "London"};
List<Office> offices= dao.findByNamedQuery("Office.findByStreetAndCity", params);

但它失败了:

java.lang.IllegalArgumentExcture:org.hibernate.查询异常:未设置所有命名参数:[城市,街道][SELECT o from Office o JOINo.addressWHEREa.street=: Street ANDa.city=:城市]

我对JPA不是很熟悉,但我认为这是失败的,因为在NamedQuery定义中使用命名参数时,我们不能按索引设置参数。


共有1个答案

欧阳向文
2023-03-14

你的假设是正确的,你把两者混为一谈。

您可以继续使用setParameter("street","Mount Eden Road")并将您的签名更改为类似于公共列表的内容

SELECT o from Office o JOIN o.address a WHERE a.street=? AND a.city=?

for(int i = 0; i < params.length; i++){
    q.setParameter(i, params[i]);
}

 类似资料:
  • 一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行增删改查的操作。这篇文档阐述了如何使用这些API。关于所有模型检索选项的详细内容,请见数据模型参考。 在整个文档(以及参考)中,我们会大量使用下面的模型,它构成了一个博客应用。 from django.db import models class Blog(models.Model): name = mo

  • 问题内容: 我有以下方法: 在这里,我依次调用三种方法,这依次命中数据库并获取我的结果,然后对从数据库命中获得的结果进行后处理。我知道如何通过使用并发调用这三种方法。但是我想用Java 8 来实现。有人可以指导我如何通过并行流实现相同目标吗? 编辑 我只想通过Stream并行调用方法。 问题答案: 您可以利用这种方式:

  • 本文向大家介绍通过什么命令查找执行命令?相关面试题,主要包含被问及通过什么命令查找执行命令?时的应答技巧和注意事项,需要的朋友参考一下 答案: which 只能查可执行文件 whereis 只能查二进制文件、说明文档,源文件等  

  • 可以在映射文档中定义查询的名字,然后就可以象调用一个命名的 HQL 查询一样直接调用命名 SQL 查询.在这种情况下,我们不 需要调用 addEntity() 方法。 <sql-query name="persons"> <return alias="person" class="eg.Person"/> SELECT person.NAME AS {person.name},

  • 执行查询 可以使用 execute() 和 query() 方法进行查询。execute() 方法会返回查询条数,query() 方法会返回结果。结果参照 PDOStatement <?php use Phinx\Migration\AbstractMigration; class MyNewMigration extends AbstractMigration { /**

  • Query 也可以直接执行一个SQL查询,即Select命令。在Postgres中支持原始SQL语句中使用 ` 和 ? 符号。 sql := "select * from userinfo" results, err := engine.Query(sql) 当调用 Query 时,第一个返回值 results 为 []map[string][]byte 的形式。 Query 的参数也允许传