您好我是EJB(NetBeans)的新手,我正在尝试通过我的servlet检索命名查询Property.findAll
,但我遇到了问题。
这个问题
非静态方法无法从静态上下文中引用T 是一种变量
AbstractFacade类
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0] + 1);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
实体类(属性)
@Entity
@Table(name = "property")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Property.findAll", query = "SELECT p FROM Property p")
, @NamedQuery(name = "Property.findByPropertyId", query = "SELECT p FROM Property p WHERE p.propertyId = :propertyId")
, @NamedQuery(name = "Property.findByPropertyType", query = "SELECT p FROM Property p WHERE p.propertyType = :propertyType")
, @NamedQuery(name = "Property.findByNumOfBedroom", query = "SELECT p FROM Property p WHERE p.numOfBedroom = :numOfBedroom")
, @NamedQuery(name = "Property.findByNumOfBathroom", query = "SELECT p FROM Property p WHERE p.numOfBathroom = :numOfBathroom")
, @NamedQuery(name = "Property.findByAddress", query = "SELECT p FROM Property p WHERE p.address = :address")
, @NamedQuery(name = "Property.findByDescription", query = "SELECT p FROM Property p WHERE p.description = :description")
, @NamedQuery(name = "Property.findByFurnish", query = "SELECT p FROM Property p WHERE p.furnish = :furnish")
, @NamedQuery(name = "Property.findByGarden", query = "SELECT p FROM Property p WHERE p.garden = :garden")
, @NamedQuery(name = "Property.findByArea", query = "SELECT p FROM Property p WHERE p.area = :area")
, @NamedQuery(name = "Property.findByBuyType", query = "SELECT p FROM Property p WHERE p.buyType = :buyType")
, @NamedQuery(name = "Property.findByPropertyPrice", query = "SELECT p FROM Property p WHERE p.propertyPrice = :propertyPrice")})
public class Property implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "PropertyId")
private Integer propertyId;
@Size(max = 45)
@Column(name = "PropertyType")
private String propertyType;
@Column(name = "NumOfBedroom")
private Long numOfBedroom;
@Column(name = "NumOfBathroom")
private Long numOfBathroom;
@Size(max = 250)
@Column(name = "Address")
private String address;
@Size(max = 500)
@Column(name = "Description")
private String description;
@Size(max = 45)
@Column(name = "Furnish")
private String furnish;
@Size(max = 45)
@Column(name = "Garden")
private String garden;
@Column(name = "Area")
private Long area;
@Size(max = 45)
@Column(name = "BuyType")
private String buyType;
@Column(name = "PropertyPrice")
private Integer propertyPrice;
@Lob
@Column(name = "ImageUrl")
private byte[] imageUrl;
@OneToMany(mappedBy = "propertyId")
private Collection<Offer> offerCollection;
@JoinColumn(name = "agentsId", referencedColumnName = "AgentsId")
@ManyToOne
private Agents agentsId;
@JoinColumn(name = "OwnerId", referencedColumnName = "OwnerId")
@ManyToOne
private Owner ownerId;
public Property() {
}
public Property(Integer propertyId) {
this.propertyId = propertyId;
}
public Integer getPropertyId() {
return propertyId;
}
public void setPropertyId(Integer propertyId) {
this.propertyId = propertyId;
}
public String getPropertyType() {
return propertyType;
}
public void setPropertyType(String propertyType) {
this.propertyType = propertyType;
}
public Long getNumOfBedroom() {
return numOfBedroom;
}
public void setNumOfBedroom(Long numOfBedroom) {
this.numOfBedroom = numOfBedroom;
}
public Long getNumOfBathroom() {
return numOfBathroom;
}
public void setNumOfBathroom(Long numOfBathroom) {
this.numOfBathroom = numOfBathroom;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getFurnish() {
return furnish;
}
public void setFurnish(String furnish) {
this.furnish = furnish;
}
public String getGarden() {
return garden;
}
public void setGarden(String garden) {
this.garden = garden;
}
public Long getArea() {
return area;
}
public void setArea(Long area) {
this.area = area;
}
public String getBuyType() {
return buyType;
}
public void setBuyType(String buyType) {
this.buyType = buyType;
}
public Integer getPropertyPrice() {
return propertyPrice;
}
public void setPropertyPrice(Integer propertyPrice) {
this.propertyPrice = propertyPrice;
}
public byte[] getImageUrl() {
return imageUrl;
}
public void setImageUrl(byte[] imageUrl) {
this.imageUrl = imageUrl;
}
@XmlTransient
public Collection<Offer> getOfferCollection() {
return offerCollection;
}
public void setOfferCollection(Collection<Offer> offerCollection) {
this.offerCollection = offerCollection;
}
public Agents getAgentsId() {
return agentsId;
}
public void setAgentsId(Agents agentsId) {
this.agentsId = agentsId;
}
public Owner getOwnerId() {
return ownerId;
}
public void setOwnerId(Owner ownerId) {
this.ownerId = ownerId;
}
@Override
public int hashCode() {
int hash = 0;
hash += (propertyId != null ? propertyId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Property)) {
return false;
}
Property other = (Property) object;
if ((this.propertyId == null && other.propertyId != null) || (this.propertyId != null && !this.propertyId.equals(other.propertyId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entities.Property[ propertyId=" + propertyId + " ]";
}
}
Servelt页面
@Override
public void init() throws ServletException {
List<Property> PropertyList= PropertyFacade.findAll();
getServletContext().setAttribute("property", PropertyList);
}
PropertyFacade类
public class PropertyFacade extends AbstractFacade<Property> {
@PersistenceContext(unitName = "testRealPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public PropertyFacade() {
super(Property.class);
}
答案 0 :(得分:0)
由于findAll不是静态的,因此您需要创建PropertyFaçade的实例。你不能只调用PropertyFacade.findAll()。在Spring中,您将从ApplicationContext获取此实例,而不确定它是如何在ejb中创建的。
注意:请注意java中的命名约定:变量以小写字母开头,类以大写字母开头。因此,您应该将PropertyList更改为propertyList。
答案 1 :(得分:0)
在您的servlet中,执行以下操作:
@EJB
PropertyFacade propertyFacade;
@Override
public void init() throws ServletException {
List<Property> PropertyList= propertyFacade.findAll();
getServletContext().setAttribute("property", PropertyList);
}
在PropertyFacade.class中添加@Stateless
注释
@Stateless
public class PropertyFacade extends AbstractFacade<Property> {
@PersistenceContext(unitName = "testRealPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public PropertyFacade() {
super(Property.class);
}
}