ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.vci.server.base.persistence.order;
 
import java.sql.Types;
 
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Order;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.type.Type;
  
public class GBKOrder extends Order {   
    private boolean ascending;   
    private boolean ignoreCase;   
    private String propertyName;   
  
    @Override  
    public String toString() {   
//        return "CONVERT( " + propertyName + " USING " + encoding + " ) " + (ascending ? "asc" : "desc");
        return "nlssort(" + propertyName + ",'NLS_SORT=SCHINESE_PINYIN_M') " + (ascending ? "asc" : "desc");
    }   
  
    @Override  
    public Order ignoreCase() {   
        ignoreCase = true;   
        return this;   
    }   
  
    /**  
     * Constructor for Order.  
     */  
    protected GBKOrder(String propertyName, boolean ascending) {   
        super(propertyName, ascending);   
        this.propertyName = propertyName;   
        this.ascending = ascending;   
    }   
  
    /**  
     * Constructor for Order.  
     */  
    protected GBKOrder(String propertyName, String dir) {   
        super(propertyName, dir.equalsIgnoreCase("ASC") ? true : false);   
        ascending = dir.equalsIgnoreCase("ASC") ? true : false;   
        this.propertyName = propertyName;   
        this.ascending = ascending;   
    }   
  
    /**  
     * Render the SQL fragment  
     *   
     */  
    @Override  
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {   
        String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);   
        Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);   
        StringBuffer fragment = new StringBuffer();   
        for (int i = 0; i < columns.length; i++) {   
            SessionFactoryImplementor factory = criteriaQuery.getFactory();   
            boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR;   
            if (lower) {   
                fragment.append(factory.getDialect().getLowercaseFunction()).append('(');   
            }   
//            fragment.append("CONVERT( " + columns[i] + " USING " + encoding + " )"); 
            fragment.append("nlssort(" + columns[i] + ",'NLS_SORT=SCHINESE_PINYIN_M')");
            if (lower)   
                fragment.append(')');   
            fragment.append(ascending ? " asc" : " desc");   
            if (i < columns.length - 1)   
                fragment.append(", ");   
        }   
        return fragment.toString();   
    }   
  
    /**  
     * Ascending order  
     *   
     * @param propertyName  
     * @return Order  
     */  
    public static Order asc(String propertyName) {   
        return new GBKOrder(propertyName, true);   
    }   
  
    /**  
     * Descending order  
     *   
     * @param propertyName  
     * @return Order  
     */  
    public static Order desc(String propertyName) {   
        return new GBKOrder(propertyName, false);   
    }   
}