【问题标题】:program not displaying desired string representation of object程序未显示所需的对象字符串表示
【发布时间】:2012-05-31 14:11:26
【问题描述】:

我用 java 编写了一个程序,它应该将所有的订单返回给供应商。 它不显示订单的 id,而是显示 sakila.entity.Order@883357,其中 sakila.entity 是包含 Order.java 和 Order.hbm.xml 的包。 我认为问题出在方法 displayResult() 中。也许有人可以弄清楚。 非常感谢!

这是程序:

package sakila.ui;

import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import sakila.entity.Comanda;
import sakila.entity.Furnizor;
import sakila.util.HibernateUtil;


public class SearchOrders extends javax.swing.JFrame {

public SearchOrders() {
    initComponents();
}


private void queryButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    //if (!idProviderTextField.getText().trim().equals(""))
            runQueryBasedOnIdFurnizor();
}                                            

private void runQueryBasedOnIdProvider(){
    executeHQLQuery("from Provider c where c.idprovider like '" +  idProvider.getText() + "%'" );

}

 private void executeHQLQuery(String hql){
    try{
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    org.hibernate.Query q = session.createQuery(hql);
    List resultList = q.list();
    displayResult(resultList);
    session.getTransaction().commit();
    }catch (HibernateException he){
        he.printStackTrace();
    }
}

  private void displayResult(List resultList){
    Vector<String> tableHeaders = new Vector<String>();
    Vector tableData = new Vector();
    tableHeaders.add("IdOrder");

    for (Object o : resultList){
        Provider p = (Provider) o;

        Set<Order> c = p.getOrder();
        Iterator it = c.iterator();
        while (it.hasNext()) {
            Object element = it.next();
            System.out.println(element);
            Vector <Object> oneRow = new Vector <Object>();
            oneRow.add(element);

        tableData.add(oneRow);
        }
    }
   resultTable1.setModel(new DefaultTableModel(tableData, tableHeaders)); 
}


public static void main(String args[]) {
        public void run() {
            new SearchOrders().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JTextField idProviderTextField;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton queryButton1;
private javax.swing.JTable resultTable1;
// End of variables declaration                   

}

这里是 Order.java 类

package sakila.entity;

// 由 Hibernate Tools 3.2.1.GA 于 2012 年 4 月 9 日晚上 10:19:40 生成

导入 java.util.HashSet; 导入 java.util.Set;

公共类 Order 实现 java.io.Serializable {

 private int idorder;
 private Client client;
 private Depozit warehouse;
 private Furnizor provider;
 private Integer idproduct;
 private Integer unitmas;
 private Integer quantity;
 private Set comdetals = new HashSet(0);
 private Set facturas = new HashSet(0);

public Order() {
}


public Order(int idorder) {
    this.idorder = idorder;
}
public Order(int idorder, Client client, Warehouse warehouse, Provider provider, Integer idproduct, Integer unitmas, Integer quantity, Set comdetals, Set facturas) {
   this.idorder = idorder;
   this.client = client;
   this.warehouse = warehouse;
   this.provider = provider;
   this.idproduct = idproduct;
   this.unitmas = unitmas;
   this.quantity = quantity;
   this.comdetals = comdetals;
   this.facturas = facturas;
}

public int getIdorder() {
    return this.idorder;
}

public void setIdorder(int idorder) {
    this.idorder = idorder;
}
public Client getClient() {
    return this.client;
}

public void setClient(Client client) {
    this.client = client;
}
public Warehouse getWarehouse() {
    return this.warehouse;
}

public void setWarehouse(Warehouse warehouse) {
    this.warehouse = warehouse;
}
public Provider getProvider() {
    return this.provider;
}

public void setProvider(Provider provider) {
    this.provider = provider;
}
public Integer getIdproduct() {
    return this.idproduct;
}

public void setIdproduct(Integer idproduct) {
    this.idproduct = idproduct;
}
public Integer getUnitmas() {
    return this.unitmas;
}

public void setUnitmas(Integer unitmas) {
    this.unitmas = unitmas;
}
public Integer getQuantity() {
    return this.quantity;
}

public void setQuantity(Integer quantity){
    this.quantity = quantity;
}
public Set getComdetals() {
    return this.comdetals;
}

public void setComdetals(Set comdetals) {
    this.comdetals = comdetals;
}
public Set getFacturas() {
    return this.facturas;
}

public void setFacturas(Set facturas) {
    this.facturas = facturas;
}

}

【问题讨论】:

  • 你能发布 Order.java 的代码吗(如果我的回答没有给你足够的帮助)?
  • 对象的默认toString() 表示是对象的完全限定类名,后跟@,后跟对象的hashCode。所以你看到的就是你应该看到的,除非你给对象的类一个像样的public String toString() 方法,它返回一个字符串,显示你希望对象显示的信息。 1+ @matt 的正确和简洁的答案。
  • @matt 你知道如何使用 toString() 方法来查看我的 id 而不是哈希码吗?也许你有时间可以帮助我。谢谢!

标签: java


【解决方案1】:

现在System.out.println(element); 行只是使用默认的toString() 方法,它打印出Order 对象的一些内部代码。

您的Order 类需要覆盖toString() 方法才能打印出订单的ID。

或者将迭代器代码更改为阅读可能会更好:

Iterator<Order> it = c.iterator();
while (it.hasNext()) {
    Order element = it.next();
    System.out.println(element.getIdorder());

这样您就不必为这种情况编写toString() 方法。通常,当您覆盖 toString() 时,您希望它打印出完整对象的文本表示:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#toString%28%29

【讨论】:

  • 感谢您的建议@matt。但如果您能告诉我如何在我的示例中使用 toString() 方法,我将不胜感激。我还发布了 Order.java。
  • 编辑了更多信息和更好的方法。
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 2012-12-08
  • 1970-01-01
  • 2016-08-15
  • 2011-08-06
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
相关资源
最近更新 更多