Java 在JTable中显示Hibernate查询
我正在寻找一种在JTable中显示通过Hibernate查询的SQL表的有效方法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)),但只要它整洁,我就不会挑剔 我有一个我在下面研究过的答案,但效果不太好。如果我继续沿着这条路走下去,我最终将不得不为它编写一个
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();
}
}