之前用Hibernate写过一些所谓的BaseDAO(通用的那种),感觉很不错,一个dao可以完成所有的基本功能,心里踏实。
可是渐渐发现这是不够的,Hibernate远没有那么简单囊括。呵呵,给大家拍一下砖。
/**
* @author liqibin
* 2010-08-26
* Base Data Access Object
* Please fill more method if necessary. Just give others a NOTE
* Remind me if there are some bugs.
*
* Cheers, open source.
* */
public class BaseDAO<T, ID_TYPE extends Serializable> implements IBaseDAO {
private Class<T> clazz;
/**
* constructor 2 with argument
* @param Class<T> c
* */
protected BaseDAO(Class<T> c){
this.clazz = c;
}
/**
* get the class
* @return T.class
* */
protected Class<T> getClazz(){
return this.clazz;
}
/**
* get session
* @return hibernate session
* */
public final Session getSession() {
return HibernateSessionFactory.getSession();
}
/**
* save single object with hibernate method
* @param T t
* */
public void save(T t){
this.getSession().save(t);
}
......
/**
* find a list of objects by Criteria or Criteria list
* @param Criterion... criterion
* */
public List<T> findByCriteria(Criterion... criterion){
Criteria crit = getSession().createCriteria(getClazz());
for (Criterion c : criterion) {
crit.add(c);
}
return crit.list();
}
/**
* find a list of objects by Criteria or Criteria list and order by Order
* @param Order order, Criterion... criterion
* */
public List<T> findByCriteria(Order order, Criterion... criterion){
Criteria crit = getSession().createCriteria(getClazz());
for (Criterion c : criterion) {
crit.add(c);
}
if (order != null) {
crit.addOrder(order);
}
return crit.list();
}
}
更多具体方法就不写上来了,如果大家愿意看,我很乐意给大家,也希望大家能给我意见。
转正题先。
现在看来,当使用lazyload的时候使用findByCriteria方法时候,很不方便。
譬如现在我有一个ADMIN表,外键指向一个PERSONNEL表的ID需要我需要怎样写呢?如果通过lazyload设置为true,而你又想通过查找ADMIN得到相应的personnel对象,用这个方法显然是不行的。没有地方给我加上createCriteria("personnel")。
当然,通用的东西很是有局限性的。
为此,我把这个类设为抽象类,让更多DAO继承之。为此作扩展。
public abstract class BaseDAO<T, ID_TYPE extends Serializable> implements IBaseDAO ...
那怎样解决这个问题呢?
在继承BaseDAO的XXXDAO上如此写:
List<Admin> admins = adminDAO.getSession().
createCriteria(Admin.class).createCriteria("personnel").
add(Restrictions.eq("login", loginName)).
add(Restrictions.eq("password", pwd)).list();
你会理所当然的得到一个异常:
org.hibernate.QueryException: could not resolve property: login of: cn.edu.scau.diserver.persistence.pojo.Personnel
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1392)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1367)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:457)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:417)
at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:68)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1578)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl$Subcriteria.list(CriteriaImpl.java:481)
......
为什么呢?
为什么说找不到 login?
答案揭晓:
add(Restrictions.eq("login", loginName))放在了createCriteria("personnel")之后,是的,当时就是这样。
adminDAO.getSession().
createCriteria(Admin.class).
createCriteria("personnel").
add(Restrictions.eq("login", loginName))
这样的写法hibernate是在你personnel中寻找login属性的。(是的,我当时也这么杯具过)
把逻辑顺序理清就没有问题了,如下:
List<Admin> admins =
adminDAO.getSession()
.createCriteria(Admin.class)
.add(Restrictions.eq("login", loginName))
.add(Restrictions.eq("password", pwd))
.createCriteria("personnel").list();
分享到:
相关推荐
hive 开发UDF 使用maven工程 引发jar包缺失 hive 开发UDF 使用maven工程 引发jar包缺失
按官方配置好了 developer.... Could not resolve com.huawei.agconnect 解决方法:把相应的插件用本地化安装 agconnect-crash-symbol-lib-1.6.1.300.jar agconnect-apms-plugin-1.6.1.300.jar agcp-1.6.1.300.jar。
`org.hibernate.QueryException: could not resolve property: isStudent of: com.zluo.hibernate.po.User [from com.zluo.hibernate.po.User u where u.isStudent = ?]` 当时就在想怎么会出现这个错误呢,
QueryException: could not resolve property 当执行HQL查询或criteria查询时,如果指定的属性名在目标类中不存在,或者属性路径有误,就会抛出此异常。例如,正确的查询可能是`from Category category where ...
Android Studio更新3.6.3之后出现Could not resolve all artifacts for configuration ‘:classpath’.问题你是否和我一样,只因在人群中多看了他一眼?![在这里插入图片描述]...
在升级Android Studio到特定版本,如3.6.1时,可能会遇到一些问题,其中一个常见的问题是“Could not resolve all artifacts for configuration ‘:classpath’”。这个错误表明Gradle无法解析所有配置的依赖项,这...
import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache....
ERROR: Failed to resolve: com.serenegiant:common:2.12.4 Show in Project Structure dialog 或者 ERROR: Failed to resolve: com.serenegiant:common:1.5.20 Show in Project Structure dialog ``` ...
Error:Could not resolve all files for configuration ‘:app:debugCompileClasspath’. > Could not resolve com.android.support:appcompat-v7:26.0.0-beta1. Required by: project :app > Could not ...
3. **使用方法**:使用MvcPager通常涉及到在控制器中计算总页数,然后在视图中调用辅助方法生成分页链接。控制器可能需要查询数据库并应用分页条件,返回包含当前页数据的模型。 4. **查询优化**:在实现分页时,应...
在使用Maven构建Java项目时,可能会遇到这样一个错误:“Failed to execute goal on project …: Could not resolve dependencies for project …”。这个错误通常表明Maven在构建过程中遇到了依赖解析问题,无法...
赠送jar包:flatbuffers-java-1.12.0.jar; 赠送原API文档:flatbuffers-java-1.12.0-javadoc.jar; 赠送源代码:flatbuffers-java-1.12.0-sources.jar; 赠送Maven依赖信息文件:flatbuffers-java-1.12.0.pom;...
如果你的项目中使用了这个类,那么你需要了解它的具体实现和使用方式,以便更好地集成到你的广告轮播中。 总的来说,使用ViewPager打造广告轮播切换效果需要理解其基本原理,熟练掌握适配器机制,以及适时地添加...
在一次代码拉取中,出现了以下问题:Could not download groovy-all.jar (org.codehaus.groovy:groovy-all:2.4.15) 详细的报错信息如下: // 报错信息如下 Could not resolve all files for configuration ':jcore-...
"6"是HTTP错误代码,表示网络连接失败,而" Couldn't resolve host name"则是进一步说明了问题在于无法解析到服务器的域名。 解决这个问题有以下几种方法: 1. **检查网络连接**:确保你的计算机连接到了互联网,...
确保将这些库添加到你的项目构建文件(如build.gradle)中: ```groovy dependencies { implementation 'com.squareup.okhttp3:okhttp:3.9.0' implementation 'com.squareup.okio:okio:1.13.0' implementation '...
主要介绍了解决Unable to access 'https://gitee.com/自己的项目/': Could not resolve host: gitee.com问题,需要的朋友可以参考下
myeclipse创建maven工程报错 Could not resolve
Could not resolve dependencies for project org.apache.flink:flink-avro-confluent-registry:jar:1.15.3: Could not find artifact io.confluent:kafka-schema-registry-client:jar:6.2.2 in maven 安装本地...