createNativeQuery设置参数

Gio*_*gos 2 jpa parameter-passing nativequery

我有以下包含NativeQuery的地方,我需要在其中设置参数,但由于未设置参数而使错误,因此查询为

SELECT movieId, title, genres FROM movies where title like '%%'"
Run Code Online (Sandbox Code Playgroud)

因此返回所有行。怎么了

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();
    }
Run Code Online (Sandbox Code Playgroud)

Ren*_*ovs 5

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)


Md.*_*rim 5

假设您的查询是“ SELECT movieId, title,genes FROM movies where title like = thor ”。

在这里,您的查询将返回一个包含movieId、标题、流派参数的列表 。在您的本机查询中,它将返回一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的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];
        }
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的进口是:

import javax.persistence.Query;
import javax.persistence.EntityManager;
Run Code Online (Sandbox Code Playgroud)

现在你的主类,你必须调用这个函数。首先获取EntityManager并调用该getMovieByTitle(EntityManager entityManager,String title)函数。调用流程如下:

导入这个

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
Run Code Online (Sandbox Code Playgroud)

现在您必须调用将执行查询并返回值的函数。你的执行代码如下所示:

@PersistenceContext
private EntityManager entityManager;

List<MovieObject> movieObjects=getMovieByTitle(entityManager,"thor");
Run Code Online (Sandbox Code Playgroud)

现在,您处理后的数据位于 List movieObjects中。

如果您想了解更多详细信息,请访问此主题

谢谢 :)