我们如何在不知道其类型的情况下迭代到 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 对象。您应该只创建一次,并在任何需要的地方使用它。
我正在按照本教程学习如何在 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 对象。您应该只创建一次,并在任何需要的地方使用它。