试图找出我遇到的问题的解决方案,但到目前为止在网上找不到任何材料来帮助我。
基本上我所拥有的是一个休息控制器中的方法,它将查询字符串传递给我的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或实体,因为查询字符串是动态的并且更改。我有的查询字符串就是例子。
答案 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;}