Java 反射,注释结合hibernate 查询的应用
准备工作:
???1.导入hibernate的引用和创建实体关系映射(包含数据库的创建)。
?? 2.为了方便输出自己写了个方便输出的类(如下)
?
?具体实现:
?1.建注释类
package test;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import org.hibernate.Hibernate;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import entities.Department;import entities.Employee;public class MainModule {private static SessionFactory sessionFactory;static {sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();}public static void main(String[] args) {//定义数组保存方法List<Method> methods = new ArrayList<Method>();// 反射所有方法for (Method method : MainModule.class.getMethods()) {// 找出哪些方法被注释类所修饰QueryMethod qmethod = method.getAnnotation(QueryMethod.class);if (qmethod == null)continue;methods.add(method);Console.writeLine("{0}.{1}", methods.size(), qmethod.values());}//获得输入String chk = Console.readLine();//集合从0开始Method m = methods.get(Integer.parseInt(chk) - 1);Session session = sessionFactory.openSession();try {// 调用目标方法m.invoke(null, new Session[] { session });} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} finally {session.close();}}@QueryMethod(values = "简单HQL查询")public static void klweradfasdf(Session session) {Query query = session.createQuery("from Department");List<Department> depts = query.list();for (Department dept : depts) {Console.writeLine("部门名称:{0}", dept.getName());}}@QueryMethod(values = "带参数名的查询")public static void iorepwqwer(Session session) {List<Department> depts = session.createQuery("from Department d where d.name=:name").setString("name", "产品部").list();for (Department dept : depts) {Console.writeLine("部门名称:{0}", dept.getName());}}@QueryMethod(values = "带参数位置的查询")public static void ewkasdf(Session session) {List<Department> depts = session.createQuery("from Department d where d.name=?").setString(0, "产品部").list();for (Department dept : depts) {Console.writeLine("部门名称:{0}", dept.getName());}}@QueryMethod(values = "单列投影")public static void jklrewqwerq(Session session) {List<String> names = session.createQuery("select d.name from Department d").list();for (String name : names) {Console.writeLine("部门名称:{0}", name);}}@QueryMethod(values = "多列投影")public static void jklasdfasdf(Session session) {List<Object[]> objs = session.createQuery("select d.id,d.name from Department d").list();for (Object[] obj : objs) {// 断言assert obj.length != 2;String id = obj[0].toString();String name = obj[1].toString();Console.writeLine("ID:{0}名称:{1}", id, name);}}@QueryMethod(values = "边查询边创建对象")public static void jkllkwwewe(Session session) {List<Department> depts = session.createQuery("select new entities.Department(d.id,d.name) from Department d").list();for (Department dept : depts) {Console.writeLine("ID:{0}Name:{1}", dept.getId(), dept.getName());}}@QueryMethod(values = "左外连接")public static void rqwerq(Session session) {List<Object[]> objs = session.createQuery("from Department d left join d.employees").list();for (Object[] obj : objs) {Department dept = (Department) obj[0];Employee emp = (Employee) obj[1];Console.write(Hibernate.isInitialized(dept.getEmployees()));Console.writeLine("部门名称:{0}", dept.getName());Console.writeLine("员工姓名:{0}", emp.getName());}}@QueryMethod(values = "迫切左外连接")public static void jklrewqwer(Session session) {List<Department> depts = session.createQuery("from Department d left join fetch d.employees").list();for (Department dept : depts) {Console.write(Hibernate.isInitialized(dept.getEmployees()));Console.writeLine("部门名称:{0}", dept.getName());for (Employee emp : dept.getEmployees()) {Console.writeLine("员工名称{0}", emp.getName());}}}@QueryMethod(values = "内连接")public static void rewqrfe(Session session) {List<Object[]> objs = session.createQuery("from Department d inner join d.employees").list();for (Object[] obj : objs) {Department dept = (Department) obj[0];Employee emp = (Employee) obj[1];Console.writeLine("部门名称:{0}", dept.getName());Console.writeLine("用户名:{0}", emp.getName());}}@QueryMethod(values = "迫切内连接")public static void jkfldsadsf(Session session) {List<Department> depts = session.createQuery("from Department d inner join fetch d.employees").list();for (Department dept : depts) {Console.writeLine("部门名称:{0}", dept.getName());for (Employee emp : dept.getEmployees()) {Console.writeLine("员工名称:{0}", emp.getName());}}}@QueryMethod(values = "隐式内连接")public static void jkfldsasdfa(Session session) {List<Employee> emps = session.createQuery("from Employee e where e.department.name like :name").setString("name", "产品部").list();for (Employee emp : emps) {Console.writeLine("员工名称:{0}", emp.getName());}}}?
?
?
未完待续!
?