【问题标题】:jpa pass reserved words in @Param Stringjpa 在@Param String 中传递保留字
【发布时间】:2016-01-02 05:09:27
【问题描述】:

我的目标是编写如下查询:

select * from Book where  author = any(select author from book)
and(genre='comedy') order by ( '' )ASC, ( pages )DESC;

'any(select author from book)' 丢失了单引号,因此我可以传递它

@Query("select b from Book b where b.author =:author and b.genre =:genre")
List<Book> findAllBySearch(@Param("author") String author,
                    @Param("genre") String genre);

这样做的原因是因为我有一个包含 5 个输入条件的表单,这些条件可能存在也可能不存在,并且我不想为每个排列编写单独的查询。我知道在运行查询之前插入了一个带有“stringInput”或“any(从书中选择标准)”的查询或空字符串或空字符串。

我想使用标准 API 或类似的东西将允许构建动态查询或插入保留的 sql 字,但我不知道如何轻松实现它,因为我正在扩展 Spring 数据 CrudRepository 而不使用实体管理器......但是...... .. 我想我必须这样做。

有谁知道如何逃避字符串输入@Param 强加的 '' 或者什么方法可以轻松工作...例如 Criteria API、存储过程、函数?

请原谅我的经验不足...

谢谢!

看起来使用 5 个可能的输入来执行此操作的唯一方法是让运行时策略根据存在的输入从 14 个不同的查询中进行选择,但我试图避免这种情况!!

【问题讨论】:

  • 我有点怀疑您是否想取消转义传递给您的应用程序的变量(无论如何,准备好的语句都不会发生这种情况)。这是乞求被利用。
  • 如果列变量是 '' 我想选择所有这些,就好像它不是标准而不是过滤器。如果变量存在,那么我将使用它进行过滤。尝试通过插入 --> any(select myColumn from book)...原因是它不是从表单上的下拉选择中选择的。
  • 请参阅 Spring Data JPA 文档中的第 3.6 节,我认为这就是您想要的。 docs.spring.io/spring-data/jpa/docs/current/reference/html/…
  • mmm CollinD 谢谢,我去看看。
  • 编辑了我的评论以添加指向正确部分的链接。

标签: spring spring-data spring-data-jpa


【解决方案1】:

所以...这是解决方案!

/**
 * A JPA-based implementation of the Book Service. Delegates to a JPA entity
 * manager to issue data access calls against the backing repository. The
 * EntityManager reference is provided by the managing container (Spring)
 * automatically.
 */
@Service("bookService")
@Repository
public class JpaBookService implements BookService {

private EntityManager em;

@PersistenceContext
public void setEntityManager(EntityManager em) {
    this.em = em;
}

public List<Book> searchBooks(String author, String genre, String pages, String year, String rating){

    List<Predicate> predList = new LinkedList<Predicate>();

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Book> c =cb.createQuery(Book.class);
    Root<Book> b = c.from(Book.class);

    if(author!="")
      predList.add(cb.equal(b.get("author"), author));
    }
    if(genre!=""){
      predList.add(cb.equal(b.get("genre"), genre));
    }
    if(pages!=""){
      predList.add(cb.equal(b.get("pages"), pages));
    }
    if(year!=""){
      predList.add(cb.equal(b.get("year"), year));
    }
    if(rating!=""){
      predList.add(cb.equal(b.get("rating"), rating));
    }
    Predicate[] predArray = new Predicate[predList.size()];
    predList.toArray(predArray);
    c.where(predArray);     

    TypedQuery<Book> q = em.createQuery(c);
    List<Book> result = q.getResultList();

    return result;

  }

}

效果很好!

约翰尼·奥。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2011-01-10
    • 2017-06-13
    • 2019-07-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多