如何使用JPA或HQL动态订购多对多关系?

Ind*_*rek 6 java many-to-many jpa hql sql-order-by

我有这样的映射:

@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<Product> products = new ArrayList<Product>();
Run Code Online (Sandbox Code Playgroud)

我可以很好地获取目录的产品,但我不能(动态)订购产品.我怎么能订购它们?我可能不得不用order-by子句写一个多对多的HQL查询?我虽然将orderBy字段名称字符串传递给查询,还是有更好的解决方案?

表是:products,product_catalog,product_product_catalog(associative table)

PS使用播放!我的实体的框架JPASupport.

Pas*_*ent 26

我可以很好地获取目录的产品,但我不能(动态)订购产品.我怎么能订购它们?

如果让JPA检索关联,则不可能.映射是静态的,使用映射可以做的最好的事情是在"检索时间"指定顺序:

9.1.28 OrderBy注释

OrderBy注释指定时的关联被检索的集合值关联的在该点的元素的顺序.

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
   String value() default "";
}
Run Code Online (Sandbox Code Playgroud)

值排序元素的语法是orderby_list,如下所示:

orderby_list::= orderby_item [,orderby_item]*
orderby_item::= property_or_field_name [ASC | DESC]
Run Code Online (Sandbox Code Playgroud)

如果未指定ASC或DESC,则假定ASC(升序).

如果未指定排序元素,则假定按关联实体的主键排序.

属性或字段名称必须与关联类的持久属性或字段的名称相对应.排序中使用的属性或字段必须对应于支持比较运算符的列.

例:

@Entity public class Course {
  ...
  @ManyToMany
  @OrderBy("lastname ASC")
  public List<Student> getStudents() {...};
  ...
}
Run Code Online (Sandbox Code Playgroud)

因此要么使用自定义查找器,要么使用Java从Java中对列表进行排序Comparator.