SQL 查询以检索 addScalar 值的值
Posted
技术标签:
【中文标题】SQL 查询以检索 addScalar 值的值【英文标题】:SQL Query to retrieve the value of addScalar value 【发布时间】:2021-05-29 05:12:17 【问题描述】:这样查询:
query1 = with codeList (bId, code) as ( select id, listagg(code, ',') ........)
select A.*, B.*, CL.code as codeListName from
tableA A left join tableB B on A.id = B.id
left join codeList CL on A.id = CL.bId
查询结果类似于以下值的列表:
a.id, a.name, a.code, b.id, b.desc, b.addr , name
你能告诉我如何使用来获取值
query.addEntity("A", TableA.class).addJoin("B", "A.tableB").addScalar("codeListName", StryingType.Instance)
/// 如何在此处获取“codeListName”?这个 addScalar 不起作用。这是正确的方法吗?
SQLQuery query = session.createSQLQuery(query1);
List<Object[]> rows = query .list();
【问题讨论】:
【参考方案1】:正如documentation中所述:
为了避免使用
ResultSetMetadata
的开销,或者只是为了更明确地返回返回的内容,可以使用addScalar()
:
对于您的情况,查询将如下所示:
List<Object[]> result = session.createNativeQuery(
"select A.id as a_id, ..., CL.code as code_list_name "
+ "from tableA A "
+ "left join tableB B on A.id = B.id "
+ "left join codeList CL on A.id = CL.bId" )
.addScalar( "a_id", LongType.INSTANCE )
.addScalar( "code_list_name", StringType.INSTANCE )
// ...
.list();
for(Object[] row : result)
Long aId = (Long) row[0]; // id
String codeListName = (String) row[1]; // code_list_name
// ...
虽然它仍然返回一个Object
数组,但这个查询将不再使用ResultSetMetadata
,因为它显式地分别从底层ResultSet
获取列作为BigInteger
和String
。这也意味着只会返回这两列,即使查询仍在使用 * 并且 ResultSet
包含的列多于列出的三列。
可以省略所有或部分标量的类型信息。
【讨论】:
以上是关于SQL 查询以检索 addScalar 值的值的主要内容,如果未能解决你的问题,请参考以下文章