【问题标题】:createNativeQuery set parametercreateNativeQuery 设置参数
【发布时间】:2017-06-25 01:56:53
【问题描述】:

我有以下内容,其中包含一个 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();
    }

【问题讨论】:

  • "?"是 JDBC 语法而不是 JPA 本机查询语法。如果使用编号参数,则语法为“?1”、“?2”等。除此之外,您应该使用 bc004346 答案所说的并将其写为 JPQL,因此可移植

标签: jpa parameter-passing nativequery


【解决方案1】:
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();
}

【讨论】:

    【解决方案2】:

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

    在这里,您的查询将返回一个包含 movieId、title、genres 参数的列表。在您的本机查询中,它将返回一个 Object[] 列表。这里 Object[] 有你想要的特定位置的数据。

    您可以按照以下步骤操作:

    您的 Projected Response 类将如下所示

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

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

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

    谢谢:)

    【讨论】:

    • 还有:like = 'thor'?
    【解决方案3】:
    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2018-01-27
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多