📄 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 + -