如何动态地订购与JPA或HQL的多对多关系?
我有这样的映射:
@ManyToMany(cascade = CascadeType.PERSIST) @JoinTable( name="product_product_catalog", joinColumns={@JoinColumn(name="product_catalog", referencedColumnName="product_catalog")}, inverseJoinColumns={@JoinColumn(name="product", referencedColumnName="product")}) public List products = new ArrayList();
我可以很好地获取目录的产品,但我不能(动态)订购产品。 我怎么能订购它们? 我可能必须使用order-by子句编写多对多的HQL查询? 我虽然将orderBy字段名称字符串传递给查询,还是有更好的解决方案?
表是:products,product_catalog,product_product_catalog(associative table)
PS使用播放! 我的实体的框架JPASupport。
我可以很好地获取目录的产品,但我不能(动态)订购产品。 我怎么能订购它们?
如果让JPA检索关联,则不可能。 映射是静态的,使用映射可以做的最好的事情是在“检索时间”指定顺序:
9.1.28 OrderBy注释
OrderBy
注释指定在检索关联时的集合值关联的元素的排序。@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface OrderBy { String value() default ""; }
值排序元素的语法是orderby_list ,如下所示:
orderby_list::= orderby_item [,orderby_item]* orderby_item::= property_or_field_name [ASC | DESC]
如果未指定ASC或DESC,则假定ASC(升序)。
如果未指定排序元素,则假定按关联实体的主键排序。
属性或字段名称必须与关联类的持久属性或字段的名称相对应。 排序中使用的属性或字段必须对应于支持比较运算符的列。
例:
@Entity public class Course { ... @ManyToMany @OrderBy("lastname ASC") public List
getStudents() {...}; ... }
因此,要么使用自定义查找器,要么使用比较器从Java中对列表进行排序。