Java 在JTable中显示Hibernate查询

Java 在JTable中显示Hibernate查询,java,hibernate,swing,Java,Hibernate,Swing,我正在寻找一种在JTable中显示通过Hibernate查询的SQL表的有效方法 Query q = em.createNamedQuery("Files.findAll"); List rl = q.getResultList(); 可能最好使用它返回的列表(在本例中,它将生成一个文件对象列表(其中文件是一个内部类,而不是java.io.File)),但只要它整洁,我就不会挑剔 我有一个我在下面研究过的答案,但效果不太好。如果我继续沿着这条路走下去,我最终将不得不为它编写一个

我正在寻找一种在JTable中显示通过Hibernate查询的SQL表的有效方法

    Query q = em.createNamedQuery("Files.findAll");
    List rl = q.getResultList();
可能最好使用它返回的列表(在本例中,它将生成一个文件对象列表(其中文件是一个内部类,而不是java.io.File)),但只要它整洁,我就不会挑剔


我有一个我在下面研究过的答案,但效果不太好。如果我继续沿着这条路走下去,我最终将不得不为它编写一个TableModel。

有很多很多方法可以做到这一点,但是你是在寻找能够自动计算列的东西还是什么?如果您使用java反射片段,您可以阅读Hibernate注释以找出列名,并以这种方式填充JTable

否则,这只是一段简单的代码。创建一个JTable和TableModel,b。用数据库数据填充显示

编辑: 我觉得这个。具体说明参见注释Processor Factory第iirc部分

编辑2: 我还发现了这个图书馆,它是。他们的一个例子是在hibernate中查找实体类以构建资源列表-我相信您可以做一些类似的事情来查找实现@column或@basic等的类。这应该允许您通过反射非常轻松地完成这项工作,但是正如我所说的,java的标准库已经提供了遍历注释树以查找列名的能力——在这一点上,通过编程的方式创建JTable应该非常容易

编辑3: 这是所有的代码和一袋芯片!从这里,您应该能够轻松地浏览地图列表,并提取出您想要的所有信息、值、其类类型、列标题的字段名。。。注意,它不是特别安全。。我已经删除了我在测试时所做的所有错误代码以保持简短

List<Map> createTable(List queryResults) {
    List<Map> r = new LinkedList<Map>();
    for (Object o : queryResults) {
         r.add(entityMap(o));
    }
    return r;
}

Map entityMap(Object obj) throws Throwable {
    Map m = new HashMap();
    for (Field field : getFields(obj.getClass())) {
        Method method = getMethod(field);
        Object value = method.invoke(obj);
        m.put(field, value);
    }
    return m;
}

List<Field> getFields(Class<?> clazz) {
    List<Field> fields = new LinkedList<Field>();

    for (Field field : clazz.getDeclaredFields()) {
        Column col = field.getAnnotation(Column.class);
        if (col != null)
            fields.add(field);
    }
    return fields;
}

Method getMethod(Field field) throws NoSuchMethodException {
    Class<?> clazz = field.getDeclaringClass();
    String name = "get" + uppercase(field.getName());
    Method method = clazz.getMethod(name);
    return method;
}

String uppercase(String str) {
    return str.substring(0,1).toUpperCase() + str.substring(1);
}
List createTable(List queryResults){
List r=新的LinkedList();
对于(对象o:queryResults){
r、 添加(实体映射(o));
}
返回r;
}
映射entityMap(对象对象对象)抛出可丢弃{
Map m=新的HashMap();
for(字段:getFields(obj.getClass())){
方法=获取方法(字段);
对象值=方法调用(obj);
m、 put(字段、值);
}
返回m;
}
列表getFields(类clazz){
列表字段=新建LinkedList();
for(字段:clazz.getDeclaredFields()){
Column col=field.getAnnotation(Column.class);
如果(列!=null)
字段。添加(字段);
}
返回字段;
}
方法getMethod(字段)抛出NoSuchMethodException{
Class clazz=field.getDeclaringClass();
String name=“get”+大写(field.getName());
方法Method=clazz.getMethod(名称);
返回法;
}
字符串大写(字符串str){
返回str.substring(0,1).toUpperCase()+str.substring(1);
}

有很多很多方法可以做到这一点,但您是否在寻找能够自动计算出列数的方法?如果您使用java反射片段,您可以阅读Hibernate注释以找出列名,并以这种方式填充JTable

否则,这只是一段简单的代码。创建一个JTable和TableModel,b。用数据库数据填充显示

编辑: 我觉得这个。具体说明参见注释Processor Factory第iirc部分

编辑2: 我还发现了这个图书馆,它是。他们的一个例子是在hibernate中查找实体类以构建资源列表-我相信您可以做一些类似的事情来查找实现@column或@basic等的类。这应该允许您通过反射非常轻松地完成这项工作,但是正如我所说的,java的标准库已经提供了遍历注释树以查找列名的能力——在这一点上,通过编程的方式创建JTable应该非常容易

编辑3: 这是所有的代码和一袋芯片!从这里,您应该能够轻松地浏览地图列表,并提取出您想要的所有信息、值、其类类型、列标题的字段名。。。注意,它不是特别安全。。我已经删除了我在测试时所做的所有错误代码以保持简短

List<Map> createTable(List queryResults) {
    List<Map> r = new LinkedList<Map>();
    for (Object o : queryResults) {
         r.add(entityMap(o));
    }
    return r;
}

Map entityMap(Object obj) throws Throwable {
    Map m = new HashMap();
    for (Field field : getFields(obj.getClass())) {
        Method method = getMethod(field);
        Object value = method.invoke(obj);
        m.put(field, value);
    }
    return m;
}

List<Field> getFields(Class<?> clazz) {
    List<Field> fields = new LinkedList<Field>();

    for (Field field : clazz.getDeclaredFields()) {
        Column col = field.getAnnotation(Column.class);
        if (col != null)
            fields.add(field);
    }
    return fields;
}

Method getMethod(Field field) throws NoSuchMethodException {
    Class<?> clazz = field.getDeclaringClass();
    String name = "get" + uppercase(field.getName());
    Method method = clazz.getMethod(name);
    return method;
}

String uppercase(String str) {
    return str.substring(0,1).toUpperCase() + str.substring(1);
}
List createTable(List queryResults){
List r=新的LinkedList();
对于(对象o:queryResults){
r、 添加(实体映射(o));
}
返回r;
}
映射entityMap(对象对象对象)抛出可丢弃{
Map m=新的HashMap();
for(字段:getFields(obj.getClass())){
方法=获取方法(字段);
对象值=方法调用(obj);
m、 put(字段、值);
}
返回m;
}
列表getFields(类clazz){
列表字段=新建LinkedList();
for(字段:clazz.getDeclaredFields()){
Column col=field.getAnnotation(Column.class);
如果(列!=null)
字段。添加(字段);
}
返回字段;
}
方法getMethod(字段)抛出NoSuchMethodException{
Class clazz=field.getDeclaringClass();
String name=“get”+大写(field.getName());
方法Method=clazz.getMethod(名称);
返回法;
}
字符串大写(字符串str){
返回str.substring(0,1).toUpperCase()+str.substring(1);
}

好吧,我现在要做的就是:

//client-side class
public String[][] getFilesArray() {
    List<Files> files = remote.getFiles();
    String[][] x = new String[files.size()][];
    for (int i = 0; i < files.size(); i++) {
        x[i] = files.get(i).getStringArray();
    }
    return x;
}

好吧,我现在要做的就是:

//client-side class
public String[][] getFilesArray() {
    List<Files> files = remote.getFiles();
    String[][] x = new String[files.size()][];
    for (int i = 0; i < files.size(); i++) {
        x[i] = files.get(i).getStringArray();
    }
    return x;
}

你看过org.hibernate.metadata类了吗。它们为您提供有关类和集合的元数据信息。您还可以调用SessionFactory.getClassMetadata(Class)来获取相关类的元数据信息。

您是否查看了org.hibernate.metadata类。它们为您提供有关类和集合的元数据信息。您还可以调用SessionFactory.getClassMetadata(Class)来获取相关类的元数据信息。

在下面的答案中
private void DataRetrive() {
    DefaultTableModel tbl = (DefaultTableModel) jtblDataRet.getModel();
    tbl.setRowCount(0);

    try {
        // call local method which was opensession
        opensession();
        if (!session.isOpen()) {
            session = Hibernate_ut.getSession().openSession();

            tx = session.beginTransaction();
            String hQ = "From Student";
            Query que = session.createQuery(hQ, Student.class);
            List<Student> list = (List) que.list();

            for (int i = 0; i < list.size(); i++) {
                Vector vt = new Vector();

                vt.add(0, list.get(i).getStudentName().toString());
                vt.add(1, list.get(i).getStudentAddr().toString());
                vt.add(2, list.get(i).getGrade().toString());
                vt.add(3, list.get(i).getContact().toString());

                tbl.addRow(vt);

            }
        }
    } catch (HibernateException e) {
        System.out.println(e);
        e.printStackTrace();
        tx.rollback();
    }
}