?? bookloaddaoimpl.java
字號:
package com.booksearch.dao;
import java.io.StringReader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.booksearch.orm.Book;
/**
* Class:BookLoadDaoImpl
* Description: 從數據庫中獲得滿足條件的所有book實體對象和記錄總數
* extens:HibernateDaoSupport
* implements:BookLoadDao
* @author feng guang
* @since 11/20/08
*/
public class BookLoadDaoImpl extends HibernateDaoSupport implements BookLoadDao {
private Analyzer writerAnalyzer;
private static final Logger logger;
static
{
logger = Logger.getLogger(com.booksearch.dao.BookLoadDaoImpl.class);
}
public void setWriterAnalyzer(Analyzer writerAnalyzer) {
this.writerAnalyzer = writerAnalyzer;
}
/**
* Function: loadBook
* Description: 從數據庫中獲得滿足條件的所有book實體對象
* Calls: no
* Called By: searchAction.execute()
* @param bookName as String
* @return ArrayList<Book>
* @throws no
*/
public ArrayList<Book> loadBook(String keyword,String searchKind,int currPage,String rankKind) {
ArrayList<Book> list = null;
if("relavancy".equals(rankKind)){
if("name".equals(searchKind)) list = this.loadBookByName(keyword, currPage);
else if("author".equals(searchKind))list = this.loadBookByAuthor(keyword, currPage);
else if("publisher".equals(searchKind))list = this.loadBookByPublisher(keyword, currPage);
else if("all".equals(searchKind)){
list = this.loadBookByName(keyword, currPage);
if(list.size()<10){
list.addAll(this.loadBookByAuthor(keyword, currPage)) ;
if(list.size()<10)
list.addAll(this.loadBookByPublisher(keyword, currPage));
}
}
}else{
list = this.loadBookByRank(keyword, searchKind, currPage, rankKind);
}
return list;
}
/**
* Function: loadBookNum
* Description: 從數據庫中獲得滿足條件的記錄總數
* Calls: no
* Called By: searchAction.execute()
* @param bookName as String
* @return long
* @throws no
*/
public long loadBookNum(String keyword,String searchKind) {
//System.out.println("searchKind>>" + searchKind);
long recordNum = 0;
if("name".equals(searchKind))recordNum = this.loadBookNumByName(keyword);
else if("author".equals(searchKind))recordNum = this.loadBookNumByAuthor(keyword);
else if("publisher".equals(searchKind))recordNum = this.loadBookPublisherNum(keyword);
else if("all".equals(searchKind)){
recordNum += this.loadBookNumByName(keyword);
recordNum += this.loadBookNumByAuthor(keyword);
recordNum += this.loadBookPublisherNum(keyword);
}
//System.out.println("recordNum>>" + recordNum);
return recordNum;
}
/**
* Function: loadAdvancedBook
* Description: 從數據庫中獲得滿足高級搜索條件的記錄
* Calls: this.getSQL()
* Called By: AdvancedSearchAction.execute()
* @param list as ArrayList<String>,currPage as int
* @return ArrayList<Book>
* @throws no
*/
public ArrayList<Book> loadAdvancedBook(String keyword,int currPage,String rankKind) {
ArrayList<String> list = new ArrayList<String> ();
StringTokenizer st = new StringTokenizer(keyword, "+");
while (st.hasMoreElements()) {
/*因為分詞之后會有一個是空的,所以進行一下判斷*/
list.add(st.nextToken());
}
//
// /*只包含書名時,按分類搜索中書名搜索進行*/
// if("null".equals(list.get(1))&&"null".equals(list.get(2))
// &&"null".equals(list.get(3))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(0))){
// ArrayList<Book> listBook = this.loadBookByName(list.get(0).replace("20%", "+"), currPage);
// return listBook;
// }else if("null".equals(list.get(0))&&"null".equals(list.get(2))
// &&"null".equals(list.get(3))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(1))){
// ArrayList<Book> listBook = this.loadBookByAuthor(list.get(1).replace("20%", "+"), currPage);
// return listBook;
// }else if("null".equals(list.get(0))&&"null".equals(list.get(1))
// &&"null".equals(list.get(2))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(3))){
// ArrayList<Book> listBook = this.loadBookByPublisher(list.get(3).replace("20%", "+"), currPage);
// return listBook;
// }
String tempRank = "";
if("bookPublishTime".equals(rankKind))
tempRank = " order by book.bookPublishTime desc ";
else if("bookFixPrice".equals(rankKind))
tempRank = " order by book.bookFixPrice asc ";
/*獲得查詢sql*/
String temp = this.getSQL(list);
String sql = "select {book.*} from bookinfo book " + temp + tempRank;
SQLQuery query = this.getSession().createSQLQuery(sql);
query.addEntity("book", Book.class);
/*設置分頁*/
query.setFirstResult((currPage-1)*10);
query.setMaxResults(10);
ArrayList<Book> listBook = (ArrayList<Book>) query.list();
// Iterator it1 = listBook.iterator();
// Book book1 = null;
// while (it1.hasNext()) {
// book1 = (Book) it1.next();
// System.out.println("bookName"+book1.getBookName()+"TIme"+book1.getBookPublishTime()+"Prince"+book1.getBookFixPrice());
// }
return (ArrayList<Book>) listBook;
}
/**
* Function: loadAdvancedBookNum
* Description: 從數據庫中獲得滿足高級搜索條件的記錄總數
* Calls: this.getSQL()
* Called By: AdvancedSearchAction.execute()
* @param list as ArrayList<String>
* @return long
* @throws no
*/
public long loadAdvancedBookNum(String keyword) {
ArrayList<String> list = new ArrayList<String> ();
StringTokenizer st = new StringTokenizer(keyword, "+");
while (st.hasMoreElements()) {
/*因為分詞之后會有一個是空的,所以進行一下判斷*/
list.add(st.nextToken());
}
// /*只包含書名時,按分類搜索中書名搜索進行*/
// if("null".equals(list.get(1))&&"null".equals(list.get(2))
// &&"null".equals(list.get(3))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(0))){
// long num = this.loadBookNumByName(list.get(0).replace("20%", "+"));
// return num;
// }else if("null".equals(list.get(0))&&"null".equals(list.get(2))
// &&"null".equals(list.get(3))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(1))){
// long num = this.loadBookNumByAuthor(list.get(1).replace("20%", "+"));
// return num;
// }else if("null".equals(list.get(0))&&"null".equals(list.get(1))
// &&"null".equals(list.get(2))&&"null".equals(list.get(4))
// &&"null".equals(list.get(5))&&"null".equals(list.get(6))
// &&"null".equals(list.get(7))&&"null".equals(list.get(8))
// &&"null".equals(list.get(9))&&!"null".equals(list.get(3))){
// long num = this.loadBookPublisherNum(list.get(3).replace("20%", "+"));
// return num;
// }
/*獲得查詢sql*/
String temp = this.getSQL(list);
String sql = "select {book.*} from bookinfo book "+temp;
SQLQuery query = this.getSession().createSQLQuery(sql);
query.addEntity("book", Book.class);
List temList = query.list();
long num = temList.size();
return num;
}
/**
* Function: loadBookByName
* Description: 從數據庫中獲得按書名方式檢索的所有記錄
* Calls: no
* Called By: this.loadBook()
* @param bookName as String,currPage as int
* @return ArrayList<Book>
* @throws no
*/
private ArrayList<Book> loadBookByName(String bookName,int currPage){
ArrayList<Book> result = new ArrayList<Book>();
ArrayList<Book> result1 = new ArrayList<Book>();
ArrayList<Book> result2 = new ArrayList<Book>();
ArrayList<Book> result3 = new ArrayList<Book>();
ArrayList<Book> result4 = new ArrayList<Book>();
final List<String> keywordArr = new ArrayList<String>();
/*按" "和"+"進行分詞處理,分成單獨的一條條記錄*/
StringTokenizer st = new StringTokenizer(bookName, " ");
while (st.hasMoreElements()) {
keywordArr.add(st.nextToken());
}
//System.out.println("關鍵字個數:"+keywordArr.size());
/*如果輸入的關鍵字不是一個時的查詢方式*/
if(keywordArr.size()>1){
/*多個關鍵字同時存在時*/
String tem1 = "from Book as book where";
for(int i = 0;i<keywordArr.size();i++){
tem1 += " book.bookName like :bookname"+i+ " and";
}
final String strHql1 = tem1.substring(0, tem1.length()-3);
/*處理分頁*/
final int firstResult = (currPage-1)*10;
final int firstEndResult = 10;
result1 = (ArrayList<Book>) this .getHibernateTemplate().executeFind( new HibernateCallback() {
public List doInHibernate(Session session){
Query query = session.createQuery( strHql1);
for(int j = 0;j<keywordArr.size();j++)
query.setString("bookname"+j, "%"+keywordArr.get(j)+"%");
query.setFirstResult(firstResult);
query.setMaxResults(firstEndResult);
return query.list();
}
} );
// System.out.println("result1:"+result1.size());
// for(int i = 0;i<result1.size();i++){
// System.out.println("result1>>"+result1.get(i).getBookName());
// }
/*多個關鍵字同時匹配不夠十條時,進行不同時匹配查詢*/
if(result1.size()<10){
/*完全匹配的記錄總數*/
long firstNum = 0;
String firstHql = "select count(*) from Book as book where";
for(int i = 0;i<keywordArr.size();i++){
firstHql += " book.bookName like ? and";
}
firstHql =firstHql.substring(0, firstHql.length()-3);
String []temKey = new String[keywordArr.size()];
for(int j = 0;j<keywordArr.size();j++)temKey[j] = "%" + keywordArr.get(j) + "%";
List firstList = this.getHibernateTemplate().find(firstHql, temKey);
if(null != firstList)
firstNum = (Long)firstList.get(0);
//System.out.println("firstNum:"+firstNum);
String tem2 = "from Book as tushu where (";
for(int i = 0;i<keywordArr.size();i++){
tem2 += " tushu.bookName like :namebook"+i+ " or";
}
final String strHq2 = tem2.substring(0, tem2.length()-2) + ")and not exists ("+strHql1+"and tushu.id=book.id)";
/*處理分頁*/
final int secondResult = (int) ((currPage-1)*10 - firstNum);
final int secondEndResult = 10-result1.size();
result2 = (ArrayList<Book>) this .getHibernateTemplate().executeFind( new HibernateCallback() {
public List doInHibernate(Session session){
Query query = session.createQuery( strHq2);
for(int j = 0;j<keywordArr.size();j++)
query.setString("namebook"+j, "%"+keywordArr.get(j)+"%");
for(int k = 0;k<keywordArr.size();k++)
query.setString("bookname"+k, "%"+keywordArr.get(k)+"%");
query.setFirstResult(secondResult);
query.setMaxResults(secondEndResult);
return query.list();
}
});
// System.out.println("result2:"+result2.size());
// for(int i = 0;i<result2.size();i++){
// System.out.println("result2>"+result2.get(i).getBookName());
// }
}
/*如果關鍵字同時存在與不同時存在的匹配記錄數之和不夠當前顯示,則對每個關鍵字分詞后查詢*/
if(result1.size() + result2.size() < 10){
long secondNum = 0;
String secondHql = "select count(*) from Book as book where";
for(int i = 0;i<keywordArr.size();i++){
secondHql += " book.bookName like ? or";
}
secondHql =secondHql.substring(0, secondHql.length()-2);
String []temKey = new String[keywordArr.size()];
for(int j = 0;j<keywordArr.size();j++)temKey[j] = "%" + keywordArr.get(j) + "%";
List firstList = this.getHibernateTemplate().find(secondHql, temKey);
if(null != firstList)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -