如何动态地订购与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中对列表进行排序。