drianResource的instance方法中(29)行调用了getThreadOrDefaultLocale函数,而在当前的类中没有定义这个函数,那么它一定是继承另外一个类,在父类中实现的,果然,它继承的是org.eigenbase.resgen.ShadowResourceBundle类,再查看一下这个类,我擦,在codegrep上根本搜不到这个类的源码,这时候请教google吧,搜出来这个网页:http://www.java2s.com/Code/Jar/e/Downloadeigenbaseresgenjar.htm,我勒个咔擦,我之前
下载的eigenbase-resgen.jar文件不就是在这里下载的吗?!而这个jar包中分明有org.eigenbase.resgen.ShadowResourceBundle类啊(要不然我的代码编译都不会通过的),一切又绕回来了,这时候该怎么办? 这时候我想起来了,既然mondrian自己能够编译通过,顺利执行,那么无论是在mondrian的maven依赖包中,还是在saifu中都应该有这个包的依赖,而且这个包应该就是可以使用的,而之前的eigenbase-resgen.jar不能使用可能是因为版本问题,查看了mondrian的pom.xml文件,发现它使用的是如下的版本:
eigenbase
eigenbase-resgen
1.3.1
查看了saiku的pom.xml文件,它使用的是如下的版本:
eigenbase
eigenbase-resgen
1.3.0.11873
虽然这两个版本不一样,但是我想应该任何一个都可以吧,于是下了1.3.1版本的,将之前的jar包换了一下之后测试一下,OK了,得到了同样的结果。 虽然得到了相同的结果,但是这里还是使用mondrian之前的execute接口来执行MDX语句的,而不是通过olap4j的方式,代码中可以看到execute接口已经被抛弃了,查看mondrian文档看到这样的注释: Deprecated. This method is deprecated and will be removed in mondrian-4.0. It operates by internally creating a statement. Better to use olap4j and explicitly create a statement. 这里说这个接口将在mondrian 4.0以后被移除了,建议使用olap4j接口创建statement的方式代替,于是又在网上搜到一片mondrian教程(http://alenzhai.iteye.com/blog/2158953),这里使用的就是olap4j的方式访问的,把代码copy下来之后进行修改,保持connection的参数和mdx语句不变,运行过之后能够得到相同的结果,只不过这种访问方式更加规范。附上源代码:
package mondrianTest;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.olap4j.Cell;
import org.olap4j.CellSet;
import org.olap4j.OlapConnection;
import org.olap4j.OlapException;
import org.olap4j.OlapStatement;
import org.olap4j.OlapWrapper;
import org.olap4j.Position;
import org.olap4j.metadata.Member;
public class Olap4jTest {
/**
* 获取连接Olap的连接
* @param url 连接Olap的URL
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public static OlapConnection getConnection(String url) throws ClassNotFoundException, SQLException{
Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
Connection connection = DriverManager.getConnection(url);
OlapConnection olapConnection = connection.unwrap(OlapConnection.class);
return olapConnection;
}
/**
* 获取查询的结构结果集
* @param mdx mdx查询语句
* @param conn Olap连接
* @return
* @throws OlapException
*/
public static CellSet getResultSet(String mdx,OlapConnection conn) throws OlapException{
OlapStatement statement = conn.createStatement();
CellSet cellSet = statement.executeOlapQuery(mdx);
return cellSet;
}
public void testQuery(){
OlapConnection connection = null;
try {
connection = getConnection("jdbc:mondrian:" +
"Jdbc=jdbc:mysql://10.241.20.157:3306/foodmart?user=root&password=root;" +
"Catalog=C:\\Users\\Administrator\\Desktop\\nrtp\\FoodMart.xml;");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String query = "SELECT { [Measures].[Unit Sales] } on columns,{ [Time].[Year].[1997] } on rows FROM Sales WHERE ([Customers].[State Province].[CA])";
//获取查询结果