Question

here is my model (simplified)

Product

@Entity
@Table(name = "products")
public class Product extends BaseEntity {

@Id     
private Long id;

private String name;
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "product_id")
private List<ProductAttribute> attributes;

}

Product Attribute

@Entity
@Table(name = "product_attribute_values")
public class ProductAttribute extends BaseEntity {

    @Id
    private Long id;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "product_id")
    private Product product;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "attribute_id")
    private Attribute attribute;
    private String value;

}

Attribute

@Entity
@Table(name = "attributes")
@Proxy(lazy = false)
public class Attribute extends BaseEntity {

    @Id
    private Long id;
    private String name;

}

i want to query a single product (by id) and order the list of attributes (ProductAttributes) by the attribute name.

This is my query

final Criteria criteria = getSession().createCriteria(Product.class);
criteria.add(Restrictions.eq("id", productId));
Criteria crit = criteria.createCriteria("attributes");
Criteria secondCriteria = crit.createCriteria("attribute");
secondCriteria.addOrder(Order.desc("name"));
return (Product) criteria.uniqueResult();

I also tried this but it didnt work (dont recognize name field)

final Criteria criteria = getSession().createCriteria(Product.class);
criteria.add(Restrictions.eq("id", productId));
criteria.createAlias("attributes", "atr");
criteria.addOrder(Order.asc("atr.attribute.name"));

Any idea?

Was it helpful?

Solution

I did it. Just create one more alias and specify the join type in both

final Criteria criteria = getSession().createCriteria(Product.class);
criteria.add(Restrictions.eq("id", searchFilter.getProductId()));
criteria.createAlias("attributes", "atrs", CriteriaSpecification.LEFT_JOIN);
criteria.createAlias("atrs.attribute", "atr", CriteriaSpecification.LEFT_JOIN);
criteria.addOrder(Order.asc("atr.name"));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top