数据访问类HibernateMemberManager的定义,接着我为了让代码漂亮点就写了另外一个类HSQLStatement:public class HibernateMemberManager implements MemberManager{
public void delete(Member dMem) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.delete(dMem);
tx.commit();
session.close();
}
public void save(Member member) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(member);
tx.commit();
session.close();
} public void update(Member mem) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.update(mem);
tx.commit();
session.close();
}
public Member getById(Long id){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Member mem = (Member) session.get(Member.class,id);
tx.commit();
session.close();
return mem;
}
public List<Member> find(Member memberFound) {
List foundMembers = null;
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
HSQLStatement statement = new HSQLStatement("from Member m");
statement.addLike("m.username", memberFound.getUsername())
.addLike("m.memname", memberFound.getMemname())
.addLike("m.mobile", memberFound.getMobile());
Query query = session.createQuery(statement.getStatement());
foundMembers = query.list();
tx.commit();
session.close();
return foundMembers;
}
}
public class HSQLStatement {
private String mainClause = "" ;
private String subClause = "";
public HSQLStatement(String theMainClause){
mainClause = theMainClause ;
}
public HSQLStatement(){}

public void setMainClause(String theMainClause){
mainClause = theMainClause ;
}
public String getMainClause(){
return mainClause ;
}
public void setSubClause(String theSubClause){
subClause = theSubClause ;
}
public String getSubClause(){
return subClause;
}
public HSQLStatement addLike(String fieldName, String fieldValue) {
if (!(fieldName == "" || fieldName == null || fieldValue == "" || fieldValue == null)) {
if (subClause == null) {
subClause = "";
}
if (subClause == "") {
subClause = fieldName + " like " + "%" + fieldValue + "%";
} else {
subClause = subClause + " and " + fieldName + " like " + "%"
+ fieldValue + "%";
}
}
return this;
}

public String getStatement(){
if(!(subClause == null || subClause == "")){
return mainClause + " where "+subClause;
}
return mainClause ;
}
}结果调试代码老是会抛出异常org.hibernate.QueryException: unexpected char: '%',Google及百度都搜了,除了使用setString来把‘%’写入HSQL语句中,还有其它方法吗?不然我要做一些代码重构事了,因为我的where子句的结构想动态构造出来,感觉使用setString不合适,因为它要把Member所有属性写入HSQL子句中去,HSQL语句会很长,看着不漂亮~