JPA 2:将@NamedNativeQuery更改为CriteriaBuilder等效项

|| 是否可以更改此@NamedQuery查询:
SELECT @rownum:=@rownum+1 \'no\', m.title, m.author, REPLACE(SUBSTRING_INDEX(m.content, \' \', 20), \'<br>\', \' \'), m.viewed, m.hashid FROM book m, (SELECT @rownum:=0) r WHERE m.lang = ?1 AND m.title like CONCAT(\'%\',?2,\'%\') ORDER BY m.title asc
等同于CriteriaBuilder。或不?...     
已邀请:
我认为,执行此操作的自然方法是在JPA中处理查询,但在Java中执行编号和字符串处理。查询如下所示:
EntityManagerFactory emf;
String lang;
String keyword;

CriteriaBuilder builder = emf.getCriteriaBuilder();
final CriteriaQuery<Book> criteria = builder.createQuery(Book.class);
Root<Book> root = criteria.from(Book.class);
criteria.where(builder.and(builder.equal(root.get(Book_.lang), lang), builder.like(root.get(Book_.title), (\"%\" + keyword + \"%\"))));
criteria.orderBy(builder.asc(root.get(Book_.title)));
由于结果返回到列表中,因此您可以简单地在\'no \'字段中使用列表中的索引,并且可以在Book上编写方法getContentSnippet()来进行子字符串替换。 如果您确实想在数据库中进行字符串处理,也许是为了减少传输的文本量,那么您可以编写一个元组查询,以检索书和摘录。注意,我仍然会检索整本书,而不是单个领域,因为这使后续编程变得更加容易。如果要避免传输全部内容,请在Book类中将其标记为延迟加载。查询如下:
CriteriaBuilder builder = emf.getCriteriaBuilder();
final CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
final Root<Book> root = criteria.from(Book.class);
final Expression<String> snippetExpr = builder.substring(root.get(Book_.content), 1, 120);
criteria.multiselect(root, snippetExpr);
criteria.where(builder.and(builder.equal(root.get(Book_.lang), lang), builder.like(root.get(Book_.title), (\"%\" + keyword + \"%\"))));
criteria.orderBy(builder.asc(root.get(Book_.title)));
我正在使用子字符串来构建代码段,因为我正在使用PostgreSQL,并且它没有SUBSTRING_INDEX函数的等效项。您可以使用CriteriaBuilder.function与MySQL一起调用它。我仍然没有在查询中进行编号或替换,因为我仍然认为最好在代码中完成。
EntityManager em = emf.createEntityManager();
TypedQuery<Tuple> q = em.createQuery(criteria);
List<Tuple> booksAndSnippets = q.getResultList();
for (int i = 0; i < booksAndSnippets.size(); ++i) {
    Tuple bookAndSnippet = booksAndSnippets.get(i);
    int no = i + 1;
    Book book = bookAndSnippet.get(root);
    String snippet = bookAndSnippet.get(snippetExpr).replace(\"<br>\", \" \");
}
我确实认为您可以更轻松地使用JPQL!     

要回复问题请先登录注册