【发布时间】:2012-02-23 10:38:57
【问题描述】:
我正在使用 Hibernate 4,并且想简单地列出表的所有行。我发现的所有解决方案都建议使用“from tablename”之类的东西,但我想避免在字符串中硬编码表名。
【问题讨论】:
标签: hibernate
我正在使用 Hibernate 4,并且想简单地列出表的所有行。我发现的所有解决方案都建议使用“from tablename”之类的东西,但我想避免在字符串中硬编码表名。
【问题讨论】:
标签: hibernate
你可以使用
session.createCriteria(MyEntity.class).list();
例如。
【讨论】:
HQL 不使用表名。它使用实体名称。实体名称是(默认情况下)类名称。所以你可以使用
String hql = "select a from " + TheEntity.class.getSimpleName() + " a";
但我更喜欢可读性而不是类型安全,并使用
String hql = "select a from TheEntity a";
无论如何,您都应该对您的查询进行自动化测试。
【讨论】:
//休眠类
public class CommonDAO<T> {
Session session = null;
Transaction transaction = null;
private Class<T> clazz;
public CommonDAO(){ //constructor
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
Type genericSuperclass = this.getClass().getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericSuperclass;
Type type = pt.getActualTypeArguments()[0];
clazz = (Class<T>) type;
}
}
public T listById(Object id) {
T object = null;
try {
object = (T) session.get(clazz, (Serializable) id);
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
}
//用户类
public class UserDAO extends CommonDAO<UserMaster> { // Here UserMaster is pojo
public UserDAO() {
super();
}
public static void main(String ar[]) {
UserMaster user = new UserDAO().listById(1); // 1 is id
System.out.println(user.getUserName());
}
}
【讨论】: