2014-09-11 123 views
0

您好我想编写一个通用的排序方法传球类成员方法

public mySortMethod(Customer customer, Customer.member sortBy) { 
     return query.from(customer).orderBy(customer.sortBy.asc()); 
} 

这样我就能做到这样调用

mySortMethod(myCustomer,Customer.name) 

的方法是有没有办法通过一个类成员转换为方法(并验证参数是“MyClass.members”的一种类型)?

我使用Java和QueryDSL JPA 感谢

回答

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

请注意,这是一种通用方法,不限于客户类。你可以通过任何类的对象。例如

mySortMethod(customerAddress, "city"); 
+0

有趣的做法,我会尝试。谢谢 – igx 2014-09-12 05:59:18

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注释作为参数上的排序要作出(在postedDate属性)属性的名称,以及该方法(上升或下降)。

字符串ASC r DESC可以分别用于升序或降序排序。

您可以在@OrderBy批注中使用多个列。如果您需要通过发布日期和备注进行订购,则可以使用OrderBy(“PostedDate DESC,note ASC”)。

@OrderBy注释对数据库映射没有任何影响。 持久性提供者只需在检索集合时通知使用order by子句。

+0

谢谢,不知道我明白了。用户实际上正在发送他想要订购的东西以及订购方向(ASC/DSC)。它如何动态地完成?你能分享一个例子吗? – igx 2014-09-11 14:01:27