创建本地查询设置参数

5

我有以下内容,其中包含一个NativeQuery,我需要设置一个参数,但是有些问题,因为参数没有被设置,所以查询失败了。

SELECT movieId, title, genres FROM movies where title like '%%'"

所以要返回所有行,有什么问题吗?

public List<T> findMovie(String keyword) {
        Query q = getEntityManager().createNativeQuery("SELECT movieId, title, genres FROM movies where title like '%?%'", entityClass);
        q.setParameter(1, keyword); //etc
        return q.getResultList();
    }

1
"?" 是 JDBC 语法而不是 JPA 原生查询语法。如果使用数字参数,则语法为 "?1"、"?2" 等。此外,您应该按照 bc004346 的答案所说的编写 JPQL,因此具有可移植性。 - Neil Stockton
3个回答

11
public List<T> findMovie(String keyword) {
    Query q = getEntityManager().createQuery("SELECT movieId, title, genres FROM movies where title like :keyword", entityClass);
    q.setParameter("keyword", keyword); //etc
    return q.getResultList();
}

如果您想使用位置参数,请使用以下语法:

public List<T> findMovie(String keyword) {
    Query q = getEntityManager().createQuery("SELECT movieId, title, genres FROM movies where title like ?1", entityClass);
    q.setParameter(1, keyword); //etc
    return q.getResultList();
}

4
假设您的查询是“SELECT movieId、title、genres FROM movies WHERE title like = thor”。
在这里,您的查询将返回一个带有movieId、title、genres参数的列表。在本机查询中,它将返回一个Object[]列表。在Object[]中,具有特定位置的所需数据。
您可以按照以下步骤进行操作: 您的预期响应类如下:
public class MovieObject{
    int movieId;
    String title;
    String genres;

    public MovieObject(Object[] columns) {
        this.movieId = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
        this.title = (String) columns[1];
        this.genres = (String) columns[2];
    }

    public int getMovieId() {
        return movieId;
    }

    public void setMovieId(int movieId) {
        this.movieId = movieId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenres() {
        return genres;
    }

    public void setGenres(String genres) {
        this.genres = genres;
    }
}

在这里,MovieObject 构造函数将映射 Movie Object[] 的位置数据。

public MovieObject(Object[] columns) {
            this.movieId = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
        this.title = (String) columns[1];
        this.genres = (String) columns[2];
        }

您的查询执行函数应如下所示

public List<MovieObject> getMovieByTitle(EntityManager entityManager,String title) {

    String queryStr = "SELECT movieId, title, genres FROM movies where title like = ?1";
    try {
        Query query = entityManager.createNativeQuery(queryStr);
        query.setParameter(1, title);

        List<Object[]> objectList = query.getResultList();

        List<MovieObject> result = new ArrayList<>();
        for (Object[] row : objectList) {
            result.add(new MovieObject(row));
        }
        return result;
    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    }
}

这里的导入是:

import javax.persistence.Query;
import javax.persistence.EntityManager;

现在你的主类,需要调用此函数。首先获取EntityManager,然后调用此getMovieByTitle(EntityManager entityManager,String title)函数。调用过程如下:

导入这个

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

现在,您需要调用执行查询并返回值的函数。 您的执行代码如下:

@PersistenceContext
private EntityManager entityManager;

List<MovieObject> movieObjects=getMovieByTitle(entityManager,"thor");

现在,您处理过的数据在电影对象列表 movieObjects中。

如果您想了解更多详情,请访问本帖

谢谢 :)


而且,使用:like = 'thor'? - powder366

0
public List<T> findMovie(String keyword) {
    Query q = getEntityManager().createQuery("SELECT movieId, title, genres FROM movies where title like CONCAT('%',?,'%')", entityClass);
    q.setParameter(1, keyword); 
    return q.getResultList();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接