1. 程式人生 > >關於jpa的Specification自定義函式,實現oracle的decode;以及如何在靜態方法中呼叫注入的service

關於jpa的Specification自定義函式,實現oracle的decode;以及如何在靜態方法中呼叫注入的service

如何在靜態方法中呼叫注入的service

Public  class ClassA{

  public static ClassA classA;

  @Resource
  private Service service;
  //原理時在工程啟動時載入,在靜態方法前載入,這樣就可以在靜態方法中呼叫注入的方法啦 @PostConstruct public void init() { classA = this;
     classA.service=service; }
}

關於jpa的Specification自定義函式

這個時自定義方法的原始碼,有註釋,不多說啦
1 /** 2 * Create an expression for the execution of a database 3 * function. 4 * @param name function name 5 * @param type expected result type 6 * @param args function arguments 7 * @return expression 8 */ 9 <T> Expression<T> function(String name, Class<T> type, 10 Expression<?>... args);
咱說說這個類,也就是
ParameterizedFunctionExpression,是如何實現動態組合排序條件,實現decode

<T> Expression<T> function(String name, Class<T> type,
Expression<?>... args);

 

//這是function實現實際呼叫的方法;他呼叫的就是這個類ParameterizedFunctionExpression的構造方法

@Override
public <T> Expression<T> function(String name, Class<T> returnType, Expression<?>... arguments) {

return new ParameterizedFunctionExpression<T>( this, returnType, name, arguments );
}

 

//ParameterizedFunctionExpression的構造方法

public ParameterizedFunctionExpression(
CriteriaBuilderImpl criteriaBuilder,
Class<X> javaType,
String functionName,
Expression<?>... argumentExpressions) {
super( criteriaBuilder, javaType, functionName );
this.argumentExpressions = Arrays.asList( argumentExpressions );
this.isStandardJpaFunction = STANDARD_JPA_FUNCTION_NAMES.contains( functionName.toUpperCase(Locale.ROOT) );
}

 

//實現

Expression<Integer> expression = null;

//儲存排序條件

List<Expression<?>> argumentExpressions = new ArrayList<Expression<?>>();

//排序欄位

argumentExpressions.add(cb.literal("grade");

//排序的順序
argumentExpressions.add(cb.literal(1));

expression = new ParameterizedFunctionExpression<Integer>((CriteriaBuilderImpl) cb, Integer.class, "decode",
argumentExpressions);

&n