我们如何在不知道其类型的情况下迭代到 List 的元素?‽‽

How could we iterate into List's elements without knowing its type?‽‽

我正在按照本教程学习如何在 NetBeans CRUD 应用程序中使用 Java 数据库: https://platform.netbeans.org/tutorials/nbm-crud.html

我已经到了需要 运行 申请的地步。

问题是:为什么输出显示:

warning: [options] bootstrap class path not set in conjunction with -source 1.7
warning: No processor claimed any of these annotations: javax.annotation.Generated
C:\Users\YonePC\Documents\NetBeansProjects\DBManager\CustomerViewer\src\org\shop\viewer\CustomerViewerTopComponent.java:51: warning: [unchecked] unchecked cast
        List<Customer> resultList = (List<Customer>) query.getResultList();
  required: List<Customer>
  found:    List
2 warnings

我们正在尝试的代码以及错误在哪里:

public CustomerViewerTopComponent() {
        initComponents();
        setName(Bundle.CTL_CustomerViewerTopComponent());
        setToolTipText(Bundle.HINT_CustomerViewerTopComponent());
        EntityManager entityManager = Persistence.createEntityManagerFactory("CustomerLibraryPU").createEntityManager();
        Query query = entityManager.createNamedQuery("Customer.findAll");
        List<Customer> resultList =  query.getResultList();
        for (Customer c : resultList) {
            jTextArea1.append(c.getName() + " (" + c.getCity() + ")" + "\n");
        }

    }

客户是一个实体class:

public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CUSTOMER_ID")
    private Integer customerId;
    @Column(name = "NAME")
    private String name;
    @Column(name = "ADDRESSLINE1")
    private String addressline1;
    @Column(name = "ADDRESSLINE2")
    private String addressline2;
    @Column(name = "CITY")
    private String city;
    @Column(name = "STATE")
    private String state;
    @Column(name = "PHONE")
    private String phone;
    @Column(name = "FAX")
    private String fax;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "CREDIT_LIMIT")
    private Integer creditLimit;
    @JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE")
    @ManyToOne(optional = false)
    private DiscountCode discountCode;
    @JoinColumn(name = "ZIP", referencedColumnName = "ZIP_CODE")
    @ManyToOne(optional = false)
    private MicroMarket zip;

... getters and setters ...

我尝试了以下方法:

public final class CustomerViewerTopComponent extends TopComponent {

    public CustomerViewerTopComponent() {
        initComponents();
        setName(Bundle.CTL_CustomerViewerTopComponent());
        setToolTipText(Bundle.HINT_CustomerViewerTopComponent());
        EntityManager entityManager = Persistence.createEntityManagerFactory("CustomerLibraryPU").createEntityManager();
        Query query = entityManager.createNamedQuery("Customer.findAll");
        List<Customer> resultList = (List<Customer>) query.getResultList();
        for (Customer c : resultList) {
            jTextArea1.append(c.getName() + " (" + c.getCity() + ")" + "\n");
        }

    }

我尝试转换列表,以将作为列表字符串的给定输入与声明的输入相匹配:列表字符串

你能帮帮我吗?

这不是错误。这是一个简单的编译器警告。它告诉您,在运行时,不会检查列表是否确实是 List<Customer>

抑制警告的正确方法是使用 TypedQuery,通过调用 createNamedQuery("Customer.findAll", Customer.class)。这不会增加任何保证该列表在运行时确实包含客户,但它会抑制警告。

但是,编译器没有发现代码中的主要问题:您不应该从 Swing 组件使用 EntityManager。这应该委托给另一个对象。每次需要执行查询时创建一个新的 EntityManagerFactory 确实不是一个好主意。 EntityManagerFactory 是一个重量级的 thread-safe 对象。您应该只创建一次,并在任何需要的地方使用它。