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!