我正在学习实体豆,当我做实验时出现此错误。我选择为实体类(用于实体Product
)创建一个会话 Bean。此文件由 NetBeans 自动创建。但它告知ProductsFacade.java uses unchecked or unsafe operations.
这是代码:
@Stateless
public class ProductsFacade implements ProductsFacadeRemote {
@PersistenceContext(unitName = "NhungBHSE02082_SE0606_AdvJava_Lab10_11-ejbPU")
private EntityManager em;
public void create(Products products) {
em.persist(products);
}
public void edit(Products products) {
em.merge(products);`enter code here`
}
public void remove(Products products) {
em.remove(em.merge(products));
}
public Products find(Object id) {
return em.find(Products.class, id);
}
public List<Products> findAll() {
return em.createQuery("select object(o) from Products as o").getResultList();
}
public List<Products> findRange(int[] range) {
Query q = em.createQuery("select object(o) from Products as o");
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
return ((Long) em.createQuery("select count(o) from Products as o").getSingleResult()).intValue();
}
}
是由于以下方法造成的:
public List<Products> findAll() {
return em.createQuery("select object(o) from Products as o").getResultList();
}
public List<Products> findRange(int[] range) {
...
return q.getResultList();
}
内部发生的情况是query.getResultList()
返回泛型List
。列表中的每个对象都是 Products
的类型。你知道,但编译器不知道。只能在运行时确定类型。因此,编译器会显示未选中或不安全操作的警告。您可以放心地忽略此警告。
如果您真的很担心,则可以将注释@SuppressWarnings("unchecked")
添加到这两种方法中,以使警告消失。
Query.getResultList
返回非泛型List
,并且隐式转换为List<Products>
。现在,由于List
是非泛型的,编译器没有必要的信息来确保它实际上是Products
的列表。这就是编译器显示警告的原因。
即使编译器不知道,但你知道它实际上总是一个Products
的列表,这保证了强制转换在运行时永远不会失败,所以你可以在这里用注释@SuppressWarnings("unchecked")
装饰你的方法
@SuppressWarnings("unchecked")
public List<Products> findAll() {
return em.createQuery("select object(o) from Products as o").getResultList();
}
这将消除警告。
另外:其他方法是使用TypedQuery
。