您好我想写一般的排序方法
public mySortMethod(Customer customer, Customer.member sortBy) {
return query.from(customer).orderBy(customer.sortBy.asc());
}
所以我可以像这样调用这个方法
mySortMethod(myCustomer,Customer.name)
有没有办法将类成员传递给方法(并验证参数“是一种”MyClass.members
)?
我正在使用Java和QueryDSL JPA 感谢
答案 0 :(得分:1)
你可以使用反射来做到这一点(不是很优雅):
public static <T> ArrayList<T> mySortMethod(T aClass, String sortBy){
try {
Field sortByField=aClass.getClass().getField(sortBy); // bombs out if field doesn't exist
return something like query.from(aClass).orderby(sortByField.getName());
} catch (NoSuchFieldException e) {
throw new BlahBlahException ("Field "+sortBy+" isn't a member of class "+aClass.getClass().getName(),e);
} catch (SecurityException e) {
throw new BlahBlahException ("Field "+sortBy+" in class "+aClass.getClass().getName()+" is not accessible",e);
}
}
你会以这种不太优雅的方式称呼它:
mySortMethod(customer, "customerLastName");
我们假设您已经创建了一个Customer
类,其中包含一个名为customerLastName
的字段。
请注意,这是一种通用方法,不限于Customer类。您可以传递任何类的对象。例如
mySortMethod(customerAddress, "city");
答案 1 :(得分:0)
为什么你不在实体类中使用@orderby注释
<强> @OrderBy 强>
可以使用@OrderBy注释完成动态排序。 “动态地”表示在检索关联时进行集合元素的排序。
@Entity
public class Comment {
@Id @GeneratedValue
private Long id;
private String nickname;
private String content;
private Integer note;
@Column(name = "posted_date")
@Temporal(TemporalType.TIMESTAMP)
private Date postedDate;
// Constructors, getters, setters
}
清单3-54。新闻实体的评论按降序发布日期排序
@Entity
public class News {
@Id @GeneratedValue
private Long id;
@Column(nullable = false)
private String content;
@OneToMany(fetch = FetchType.EAGER)
@OrderBy("postedDate DESC")
private List<Comment> comments;
// Constructors, getters, setters
}
@OrderBy注释将必须进行排序的属性的名称(publishedDate属性)以及方法(升序或降序)作为参数。
字符串ASC r DESC可以分别以升序或降序方式进行排序。
您可以在@OrderBy注释中使用多个列。如果您需要按发布日期和备注订购,您可以使用OrderBy(&#34; postedDate DESC,注意ASC&#34;)。
@OrderBy注释对数据库映射没有任何影响。 在检索集合时,只需通知持久性提供程序使用order by子句。