将类成员传递给方法

时间:2014-09-11 11:36:41

标签: java jpa querydsl

您好我想写一般的排序方法

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

所以我可以像这样调用这个方法

mySortMethod(myCustomer,Customer.name)

有没有办法将类成员传递给方法(并验证参数“是一种”MyClass.members)?

我正在使用Java和QueryDSL JPA 感谢

2 个答案:

答案 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子句。