Hi I'm new to EJB (NetBeans), I'm trying to retrieve Named queryProperty.findAll
via my servlet but I'm having a problem.
this the problem
non static method cannot be referenced from a static context where T is a type of variable
AbstractFacade class
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 class (Property)
@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 page
@Override
public void init() throws ServletException {
List<Property> PropertyList= PropertyFacade.findAll();
getServletContext().setAttribute("property", PropertyList);
}
PropertyFacade class
public class PropertyFacade extends AbstractFacade<Property> {
@PersistenceContext(unitName = "testRealPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public PropertyFacade() {
super(Property.class);
}
Since findAll is not static, you need to create an instance of your PropertyFaçade. You can't just call PropertyFacade.findAll(). In spring, you would get this instance from the ApplicationContext, not sure how it is being created in ejb.
Note: mind the naming convention in java: the variables start with lowercase letter and the classes start with an uppercase letter. So, you should change PropertyList to propertyList.