Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于查询结果列表构造JSON对象_Java_Json_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java 基于查询结果列表构造JSON对象

Java 基于查询结果列表构造JSON对象,java,json,spring,hibernate,spring-mvc,Java,Json,Spring,Hibernate,Spring Mvc,试图为我所面临的问题找到解决方案,但迄今为止在网上找不到任何帮助我的资料 本质上,我拥有的是rest控制器中的一个方法,它将查询字符串传递给我的Hibernate DAO,并获取请求的返回数据 e、 g 道: 因此,没有标题和日期被转换成数字。 我想要实现的是让方法以以下格式返回结果: [ [ -4890.38, 1451826000000, 25.04, 1421499600000 ], [

试图为我所面临的问题找到解决方案,但迄今为止在网上找不到任何帮助我的资料

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

e、 g

道:

因此,没有标题和日期被转换成数字。 我想要实现的是让方法以以下格式返回结果:

[
    [
        -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或实体,因为查询字符串是动态的且不断变化。我这里的查询字符串就是一个例子。

如果不知道
T
看起来是什么样子,很难判断。。。但我相信
T
toString
方法是你的朋友

可以创建对象模型

比如说

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();
    }
@RequestMapping(/submitQuery)
公共列表提交查询(){
String query=“从CAR C、RFT R中选择C.amount作为amountc,C.transactionDate作为datec,R.amount作为amount,R.transactionDate作为dater”;
返回DAO.submitQuery(查询);
}
公共列表提交查询(字符串查询){
Query q=getSession().createQuery(查询);
返回q.list();
}

创建一个bean类let
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;
}
我想你已经回答了。检查已编辑的“如何转换为地图”部分。或者试试下面的方法

public List<Map<String,Object>> submitQuery(String query) {
        Query q = getSession().createQuery(query);
        return q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
    }
公共列表提交查询(字符串查询){
Query q=getSession().createQuery(查询);
返回q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
}

使用HQL中的select new map语法获取映射中每一行的结果

基本上,如果您按照以下方式构造HQL查询:

"SELECT new HashMap(user.id as id, user.firstName as fullName) FROM User user"; 
{
"id" : "<id value>",

"fullname" : "<firstname value>"
}
然后返回值将形成一个映射结构,这是一种很好的格式,可以轻松地序列化为JSON。您的地图(和json)将如下所示:

"SELECT new HashMap(user.id as id, user.firstName as fullName) FROM User user"; 
{
"id" : "<id value>",

"fullname" : "<firstname value>"
}
{
“id”:“,
“全名”:”
}

使用字段
amountc、datec、amountr、dater
创建一个数据传输对象,而不是返回
DAO。submitQuery(query)
从此列表构建一个DTO列表并返回它。查询字符串更改,因此DTO需要更改。无法使用对象。请将结果转换为Map。您可以提供@ShijukbabuObjects的示例吗?简单来说,我无法使用对象,因为查询字符串是动态的,所以一旦更改对象,您的对象就会过时并抛出错误。T不相关,因为它将返回包含结果的对象。但是,我不能在查询字符串更改时使用预定义的实体。T并不无关,只要它出现在DAO submitQuery方法签名中。您不必定义T,因此它将返回一个对象,使它与它是什么无关。这不是我所说的。您可以强制使用toString thoughRight的特定格式,但前提是存在要转换为字符串的特定对象/实体。我没有使用对象/实体,因为查询是动态的,可以一时兴起而更改。您是否阅读了“不能使用实体或DTO”的部分?当查询更改为“从车辆r选择r.id”时会发生什么情况?如果您不希望DTO或实体,则可以使用“条件。别名\u到\u实体\u映射”将结果转换为具有密钥和值对的哈希映射。请在帖子中添加更多详细信息。不鼓励只提供链接的答案,因为如果提供的链接发生变化,这些答案将毫无用处。瞧!真神奇……)但是列的序列以JSON格式被更改了..谢谢。。这张单子对我很管用。
{
"id" : "<id value>",

"fullname" : "<firstname value>"
}