簡體   English   中英

非靜態方法不能從靜態上下文中引用,其中T是變量的類型

[英]non static method cannot be referenced from a static context where T is a type of variable

嗨,我是EJB(NetBeans)的新手,我試圖通過我的servlet檢索命名查詢Property.findAll ,但是遇到問題。 這個問題

非靜態方法不能從靜態上下文中引用,其中T是變量的類型

抽象門面類

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);       

    }

物業門面類

public class PropertyFacade extends AbstractFacade<Property> {

    @PersistenceContext(unitName = "testRealPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public PropertyFacade() {
        super(Property.class);
    }

由於findAll不是靜態的,因此您需要創建PropertyFaçade的實例。 您不能只調用PropertyFacade.findAll()。 在春季,您將從ApplicationContext獲得此實例,而不知道如何在ejb中創建它。

注意:請注意Java中的命名約定:變量以小寫字母開頭,而類以大寫字母開頭。 因此,您應該將PropertyList更改為propertyList。

在您的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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM