【问题标题】:How can i add column names to the ResultSet. I use Java with the EntityManager如何将列名添加到 ResultSet。我将 Java 与 EntityManager 一起使用
【发布时间】:2018-07-04 19:53:50
【问题描述】:

是否可以读出列名?

我的应用程序:Java、SpringBoot、JPA、Hibernate

我的代码:

Query query = entityManager.createNativeQuery(
          "select name as Name, concat('Time:',time, ' AND:', event) as FOO 
          from XYZ
          where NAME = 'BLA'");
List<Object[]> resultList = query.getResultList();

我需要 ResultSet 的第一个 Object[] 中的列名(名称和 FOO)或 别的地方……

我难看的解决方案:

private String getColumnNames(String sql) {
    StringBuilder sb = new StringBuilder();
    String part1 = sql.split("from")[0];

    part1 = part1.replaceAll("\\(.*?\\)", "");

    String[] columns = part1.split(",");
    for (String column : columns) {
        String alias = column;
        if (column.toUpperCase().contains(" AS ")) {
            alias = column.toUpperCase().split(" AS ")[1];
        }
        alias = alias.replace("'","");
        sb.append(alias+",");
    }

    String columnNames = sb.toString();
    if (columnNames.length() != 0) {
        columnNames = columnNames.substring(0, columnNames.length()-1);
    }

    return columnNames;
}

谢谢

【问题讨论】:

  • 管理员可以在数据库中存储这样的声明。所以我不能创建一个映射类,因为我只有 SQL 字符串。

标签: java sql hibernate entitymanager


【解决方案1】:

您应该使用createNativeQuery() 的其他重载版本:

public Query createNativeQuery(String sqlString, Class resultClass);

public Query createNativeQuery(String sqlString, String resultSetMapping);

通过这种方式,您可以将查询结果映射到包含namefoo 字段的类。

以第一种方式为例:

Query query = entityManager.createNativeQuery(
          "select name as Name, concat('Time:',time, ' AND:', event) as FOO 
          from XYZ
          where NAME = 'BLA'", Xyz.class);
List<Xyz> resultList = query.getResultList();

请注意,query.getResultList() 将返回原始类型。

【讨论】:

  • 管理员可以在数据库中存储这样的声明。所以我不能创建一个映射类,因为我只有 SQL 字符串。
【解决方案2】:

你在这里应该做的是:

  1. 首先创建一个具有NameFOO 属性的实体,以便您可以将其映射为query.getResultList() 的结果。
  2. 然后将其映射为List&lt;YourEntity&gt; 而不是List&lt;Object[]
  3. 最后一件事是为请求定义一个映射器,以便它可以将这些结果映射到所需的实体,如果查询使用不同于实体中的属性名称,使用@987654321 @。

您可以查看Hibernate Tips: How to map native query results to entities tutorial 了解更多详情。

编辑:

如果您无法创建新的Entity 来映射结果,您可以将这些结果映射到HashMap 的每个Object[] 元素中,如下所示:

Map results = new HashMap();

results.put("Name", obj[0]);
results.put("Foo", obj[1]);

【讨论】:

  • 管理员可以在数据库中存储这样的声明。所以我不能创建一个映射类,因为我只有 SQL 字符串。
【解决方案3】:

是的,这是可能的。假设您的实体名称是 XYZ,而您的 Repository 是 XYZRepository,让我们创建一个仅包含 name 和 eventDetais 的 DTO,因为我们只想从表中提取这两个详细信息。

public class XyzDTO {
    String name;
    String eventDetails;
    public XyzDTO() {
    }
    public XyzDTO(String name, String eventDetails) {
     this.name = name;
     this.eventDetails =eventDetails;
    }
}

此代码将编写在 XYZRepository 中。

@Query(nativeQuery = true)
List<Details> getList();

此代码将编写为 XYZ 实体。

@SqlResultSetMapping(name = "getList",
        classes = @ConstructorResult(targetClass = XyzDTO.class,
            columns = {@ColumnResult(name = "name", type = String.class),
                @ColumnResult(name = "eventDetails", type = String.class)}))
@NamedNativeQuery(name = "XYZ.getList",
        query = "select name as name, concat('Time:',time, ' AND:', event) as eventDetails from XYZ where name = 'BL")
public class XYZ implements Serializable {

}

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多