EJBQL - not pulling records correctly
tsar_bomba Apr 4, 2006 2:46 PMI've got a simple parent/child relationship (one-to-many) between two objects; ProductCategory->Product
Here's the two domain object classes:
@Entity
@Table(name="tbl_product_category")
public class ProductCategory implements Serializable
{
 private long categoryId;
 private String name;
 private String description;
 private List<Product> products;
 public ProductCategory()
 {
 }
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 public long getCategoryId()
 {
 return this.categoryId;
 }
 public void setCategoryId(long categoryId)
 {
 this.categoryId = categoryId;
 }
 @NotNull @Length(max=500)
 public String getDescription()
 {
 return this.description;
 }
 public void setDescription(String description)
 {
 this.description = description;
 }
 @NotNull @Length(max=50)
 public String getName()
 {
 return this.name;
 }
 public void setName(String name)
 {
 this.name = name;
 }
 @OneToMany(mappedBy="productCategory", fetch=FetchType.EAGER)
 public List<Product> getProducts()
 {
 return this.products;
 }
 public void setProducts(List<Product> products)
 {
 this.products = products;
 }
}
@Entity
@Table(name="tbl_product")
public class Product implements Serializable
{
 private long productId;
 private ProductCategory productCategory;
 private String productCode;
 private String shortName;
 private String longName;
 private String summary;
 private String description;
 private float unitPrice;
 private float weight;
 private float height;
 private float width;
 private float length;
 private float insuredValue;
 private Date nextAvailableDate;
 private String thumbnail;
 private String photo;
 private boolean isAddOn;
 private List<Configuration> configurations;
 public Product()
 {
 }
 @Length(max=1000)
 public String getDescription()
 {
 return this.description;
 }
 public void setDescription(String description)
 {
 this.description = description;
 }
 public float getHeight()
 {
 return this.height;
 }
 public void setHeight(float height)
 {
 this.height = height;
 }
 public float getInsuredValue()
 {
 return this.insuredValue;
 }
 public void setInsuredValue(float insuredValue)
 {
 this.insuredValue = insuredValue;
 }
 public float getLength()
 {
 return this.length;
 }
 public void setLength(float length)
 {
 this.length = length;
 }
 @Length(max=50) @NotNull
 public String getPhoto()
 {
 return this.photo;
 }
 public void setPhoto(String photo)
 {
 this.photo = photo;
 }
 @Length(min=5,max=20) @NotNull
 public String getProductCode()
 {
 return this.productCode;
 }
 public void setProductCode(String productCode)
 {
 this.productCode = productCode;
 }
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 public long getProductId()
 {
 return this.productId;
 }
 public void setProductId(long productId)
 {
 this.productId = productId;
 }
 @Length(max=50) @NotNull
 public String getThumbnail()
 {
 return this.thumbnail;
 }
 public void setThumbnail(String thumbnail)
 {
 this.thumbnail = thumbnail;
 }
 public float getUnitPrice()
 {
 return this.unitPrice;
 }
 public void setUnitPrice(float unitPrice)
 {
 this.unitPrice = unitPrice;
 }
 public float getWeight()
 {
 return this.weight;
 }
 public void setWeight(float weight)
 {
 this.weight = weight;
 }
 public float getWidth()
 {
 return this.width;
 }
 public void setWidth(float width)
 {
 this.width = width;
 }
 @Length(max=1000)
 public String getSummary()
 {
 return this.summary;
 }
 public void setSummary(String summary)
 {
 this.summary = summary;
 }
 @OneToMany(mappedBy="product", fetch=FetchType.EAGER)
 public List<Configuration> getConfigurations()
 {
 return this.configurations;
 }
 public void setConfigurations(List<Configuration> configurations)
 {
 this.configurations = configurations;
 }
 @ManyToOne
 public ProductCategory getProductCategory()
 {
 return this.productCategory;
 }
 public void setProductCategory(ProductCategory productCategory)
 {
 this.productCategory = productCategory;
 }
 @Length(max=100) @NotNull
 public String getLongName()
 {
 return this.longName;
 }
 public void setLongName(String longName)
 {
 this.longName = longName;
 }
 @Length(max=50) @NotNull
 public String getShortName()
 {
 return this.shortName;
 }
 public void setShortName(String shortName)
 {
 this.shortName = shortName;
 }
 @NotNull
 public Date getNextAvailableDate()
 {
 return this.nextAvailableDate;
 }
 public void setNextAvailableDate(Date nextAvailableDate)
 {
 this.nextAvailableDate = nextAvailableDate;
 }
 public boolean isAddOn()
 {
 return this.isAddOn;
 }
 public void setAddOn(boolean isAddOn)
 {
 this.isAddOn = isAddOn;
 }
}
When I query like this, from the category down:
 public List<ProductCategory> getAllCategories()
 {
 Query q = this.em.createQuery("select pc from ProductCategory pc where pc.products.addOn = false");
 return q.getResultList();
 }
It returns only the category that = true, not false...the exact opposite of what I want! If I switch this to true, I get the same results.
If I query at the Product level, like so:
 public List<Product> getNonAddOns()
 {
 Query q = this.em.createQuery("select p from Product p where p.addOn = false");
 return q.getResultList();
 }
...I get exactly what I expect...
What I want is to get all categories & products but I want the products excluded where the isAddOn field = false (MSSQL bit field).
What am I doing wrong?
Thanks!
