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 获取列作为BigIntegerString。这也意味着只会返回这两列,即使查询仍在使用 * 并且 ResultSet 包含的列多于列出的三列。

可以省略所有或部分标量的类型信息。

【讨论】:

以上是关于SQL 查询以检索 addScalar 值的值的主要内容,如果未能解决你的问题,请参考以下文章

如何检索表的值以获取sql中两列的最大值

大查询:如何检索与字段 2 对应的字段 1 中的值

SQL学习02——检索数据

SQL查询以从逗号分隔的列中检索值[重复]

Hibernate检索策略

以 XML 形式检索 SQL 数据的问题