根据查询结果列表

时间:2015-08-04 09:00:00

标签: java json spring hibernate spring-mvc

试图找出我遇到的问题的解决方案,但到目前为止在网上找不到任何材料来帮助我。

基本上我所拥有的是一个休息控制器中的方法,它将查询字符串传递给我的Hibernate DAO并获取所请求的返回数据。

e.g。

@RequestMapping("/submitQuery")
    public Object submitQuery() {
// example of a query string, note this is dynamic and thus never hardcoded
        String query = "SELECT C.amount, C.transactionDate, R.amount, R.transactionDate FROM CAR C, RFT R";

        return  DAO.submitQuery(query);
    }

DAO:

public List<T> submitQuery(String query) {
        Query q = getSession().createQuery(query);
        return q.list();
    }

此查询字符串将是动态的,因此无法选择创建实体并将其附加到查询中。

上述方法将以下列格式返回数据:

[
    [
        -4890.38,
        1451826000000,
        25.04,
        1421499600000
    ],
    [
        -660,
        1413205200000,
        25.04,
        1421499600000
    ],
    [
        -10768.53,
        1423054800000,
        25.04,
        1421499600000
    ]
]

因此没有标题,并且在该日期之上已经转换为数字。 我想要实现的是让方法以下列格式返回结果:

[
    [
        "amountc" : -4890.38,
        "datec" : "01-03-2014",
        "amountr" : 25.04,
        "dater" : "01-03-2014"
    ],
    [
        "amountc" : -660,
        "datec" : "03-02-2014",
        "amountr" : 25.04,
        "dater" : "03-02-2014"
    ],
    [
        "amountc" : -10768.53,
        "datec" : "01-02-2014",
        "amountr" : 25.04,
        "dater" : "01-02-2014"
    ]
]

任何建议/协助都将不胜感激。

注意:无法使用DTO或实体,因为查询字符串是动态的并且更改。我有的查询字符串就是例子。

5 个答案:

答案 0 :(得分:2)

创建一个bean类,让ABC.java包含setter和getter方法,并将toString覆盖到DTO类中。

  public class ABC implements Serializable{

    private double amountc;
    private String datec;
    private double amountr;
    private String  dater;

    ... setter and getters

    @Override
    public String toString(){
        return "[\"amountc:\""+amountc+",\"datec:\""+datec+",\"amountr:\""+amountr+",\"dater:\""+dater+"]";
    }
}

并对DAO实现类进行一些更改

public List<ABC> submitQuery(String query) {
    Query q = getSession().createQuery(query).setResultTransformer(Transformers.aliasToBean(ABC.class));
    List<ABC> resultList=q.list();
    System.out.println(resultList); //desire output 
    return resultList;
}

请确保数据类型应与实体和DTO类ABC

相同

<强> EDITED

如果您不想要任何bean或DTO,那么您可以使用Criteria.ALIAS_TO_ENTITY_MAP将结果查询转换为具有键值对的映射对象.key name与sql中的别名相同query.if你没有在sql查询中使用别名,那么key就像0,1,2,3,....等等。

public List<ABC> submitQuery(String query) {
        Query q = getSession().createQuery(query).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        List<ABC> resultList=q.list();
        System.out.println(resultList); //desire output 
        return resultList;
    }

答案 1 :(得分:0)

很难说不知道T的样子......但我相信T&#39; toString方法是你的朋友。

答案 2 :(得分:0)

您可以创建对象模型

例如

class TransObj  {

public double amountc;
public String datec;
public double amountr;
public String  dater;
public double getAmountc() {
    return amountc;
}
public void setAmountc(double amountc) {
    this.amountc = amountc;
}
public String getDatec() {
    return datec;
}
public void setDatec(String datec) {
    this.datec = datec;
}
public double getAmountr() {
    return amountr;
}
public void setAmountr(double amountr) {
    this.amountr = amountr;
}
public String getDater() {
    return dater;
}
public void setDater(String dater) {
    this.dater = dater;
}
}

然后将代码修改为此

@RequestMapping("/submitQuery")
public List<TransObj> submitQuery() {
    String query = "SELECT C.amount as amountc, C.transactionDate as datec, R.amount as amountr, R.transactionDate as dater FROM CAR C, RFT R";

    return  DAO.submitQuery(query);
}


public List<TransObj> submitQuery(String query) {
        Query q = getSession().createQuery(query);
        return q.list();
    }

答案 3 :(得分:0)

我认为Sunil已经回答了。检查已编辑的部分,了解如何转换为地图。或者尝试以下

public List<Map<String,Object>> submitQuery(String query) {
        Query q = getSession().createQuery(query);
        return q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
    }

答案 4 :(得分:0)

使用HQL中的select new map语法来获取Map中每行的结果。

基本上,如果您构建这样的HQL查询:&#34;从User user&#34;中选择新地图(user.id为id,user.firstName为fullName);

然后返回值将形成一个地图结构,这是一个很好的格式,可以作为JSON返回,你可以通过说(返回值为键)来自定义键;

{&#34; ID&#34; :&#34; user.id&#34;,

&#34;全名&#34; :&#34; user.fristname&#34;}