2011-04-14 87 views

回答

1

我認爲這樣做的自然方法是處理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))); 

由於結果回來的列表,你可以簡單地使用索引列表中爲「否」字段,你可以在書上寫出的方法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,但!

+0

是的,在嘗試了很多不同的方法後,包括 CriteriaBuilder,JPQL是迄今爲止最簡單的方法。如果Primefaces有一種編號返回結果集的方法,那麼我不需要'@rownum:= @ rownum + 1'。唉,我現在只需要堅持使用JPQL,並希望未來版本的JSF,JPA和Primefaces能夠提供更好的定製顯示信息的方法。 – ChuongPham 2011-04-17 11:36:48

+0

Aha,所以這就是爲什麼你在查詢中做了這麼多的邏輯:你是在一些骨頭的UI庫的擺佈。這可能值得重新發布,作爲Primefaces/JSF關於如何在列表中迭代添加編號的問題。 – 2011-04-17 12:47:04

+0

謝謝,湯姆。我會嘗試最後一件事,如果這不起作用,我會重新發布上面的Primefaces問題。 – ChuongPham 2011-04-17 14:52:22