【问题标题】:Problems with scalar values in native hibernate/jpa query using annotations使用注释的本机 hibernate/jpa 查询中的标量值问题
【发布时间】:2012-06-30 20:45:28
【问题描述】:

我正在尝试运行一个包含 group by 子句的简单 SQL 查询。

历史实体:

@Entity
@NamedNativeQueries(value = {
    @NamedNativeQuery(name = HistoryEntity.FIND_ALL_BY_REFERENCE,
                      query = "SELECT h.id, h.reference, h.lrn "
                          + "FROM dataHistory h "
                          + "WHERE h.reference = :referenceNumber OR h.lrn = :referenceNumber",
                      resultSetMapping = HistoryEntity.FIND_ALL_BY_REFERENCE_MAPPING),
    @NamedNativeQuery(name = HistoryEntity.FIND_REFERENCE_BY_LRN,
                      query = "SELECT h.reference as reference "
                          + "FROM dataHistory h "
                          + "WHERE h.lrn = :lrn "
                          + "GROUP BY h.reference",
                      resultSetMapping = "resultMapping")                   
})
@SqlResultSetMappings(value = {
    @SqlResultSetMapping(name = HistoryEntity.FIND_ALL_BY_REFERENCE_MAPPING, entities = {
            @EntityResult(entityClass = HistoryEntity.class, fields = {
                @FieldResult(name = "id", column = "id"),
                @FieldResult(name = "reference", column = "reference"),
                @FieldResult(name = "lrn", column = "lrn")
            })
    }),
    @SqlResultSetMapping(name = "resultMapping", columns = {
            @ColumnResult(name = "reference")
    })
})
public class HistoryEntity implements Serializable {

/**
 * @param referenceNumber Referenz (LRN oder BRN)
 * @param brnList Liste von BRNs
 */
public static final String FIND_ALL_BY_REFERENCE = "HistoryEntity.findAllByReference";

public static final String FIND_ALL_BY_REFERENCE_MAPPING = "HistoryEntity.findAllByReferenceMapping";

private Integer id;

private String reference;
private String lrn;

public HistoryEntity() {}

@Id
public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getReference() {
    return reference;
}

public void setReference(String reference) {
    this.reference= reference;
}

public String getLrn() {
    return lrn;
}

public void setLrn(String lrn) {
    this.lrn = lrn;
}

在服务类中,我执行如下查询:

Query query = entityManager.createNamedQuery("myQuery");
query.setParameter("lrn", lrn);

List resultList = query.getResultList();

根据查询结果,列表包含 java.lang.Character 的:

案例 1:
SQL-Result(如果我在 sql 客户端中运行 sql):
|参考 |
| 123456780678MMM |
| 123456781678MMM |
| 123456782678MMM |
| 123456783678MMM |

Java-List-Result(在 Java 调试视图中):
[1, 1, 1, 1]

案例 2:
SQL 结果:
|参考 |
| 123456780678MMM |

Java 列表结果:
[1]

我正在寻找一种方法来运行一个带有标量值的简单 sql 查询(使用 hibernate/jpa),以获取一个包含结果值的列表。

有什么方法可以在不使用标准 api 的情况下做到这一点?

如果您需要更多信息,请告诉我!

非常感谢您的帮助。

马可

【问题讨论】:

  • DataHistory 中的reference 属性如何注解? (您的问题的答案是肯定的,但目前有问题。您想要 JPA 2.0 解决方案还是 Hibernate 专有的解决方案适合您?)
  • 由于 DataHistory 包含来自两个表的值,我使用 NamedNativeQueris 和 SqlResultSetMapping 来填充实体。因此,属性reference 没有注释。也许我必须将@EntityResult 添加到@SqlResultSetMapping(name = "resultMapping")。我更喜欢 JPA 2.0 解决方案,但专有的 Hibernate 解决方案也可以。
  • 如果引用没有注释,你会在结果中看到:“错误”类型。 DataHistory 不是实体吗? (一个实体可以分布在 N 个表中......)也许你可以给我们更多的代码/注释?如果您不使用 NamedQueries / Proper Entities,那么您将失去使用 JPA 的许多好处,几乎到了根本看不到使用该技术的意义的地步。 (命名)NativeQueries 只是 jdbc-sql-queries 与一些自动映射。
  • 我更新了问题中的 HistoryEntity 类。我希望这能帮助你更多地理解这个问题。我省略了左连接和一些属性。我尝试进行不同的查询并获得一个简单的列表,其中的值作为结果。
  • 现在工作/忙碌 - 所以我会在几个小时内查看它,除非其他人给出答案。

标签: java sql hibernate annotations jpa-2.0


【解决方案1】:

问题是休眠中的一个错误,它将结果转换为 java.lang.Character insteat of java.lang.String。结果中只返回每行的第一个字符。

还有一个问题有更详细的解决方案描述:
Hibernate native query - char(3) column

如果我在查询中使用 cast 函数,如下所示,它可以工作:

@NamedNativeQuery(name = HistoryEntity.FIND_REFERENCE_BY_LRN,
                  query = "SELECT cast(h.reference as VARCHAR(27)) as reference "
                      + "FROM dataHistory h "
                      + "WHERE h.lrn = :lrn "
                      + "GROUP BY h.reference",
                  resultSetMapping = "resultMapping")  

PS:我发现引用的问题很晚。对不起!

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2011-09-29
    • 2018-08-03
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多