Java 使用注释的本机hibernate/jpa查询中标量值的问题

Java 使用注释的本机hibernate/jpa查询中标量值的问题,java,sql,hibernate,annotations,jpa-2.0,Java,Sql,Hibernate,Annotations,Jpa 2.0,我正在尝试运行一个包含GROUPBY子句的简单SQL查询 历史实体: @Entity @NamedNativeQueries(value = { @NamedNativeQuery(name = HistoryEntity.FIND_ALL_BY_REFERENCE, query = "SELECT h.id, h.reference, h.lrn " + "FROM dataHistory

我正在尝试运行一个包含GROUPBY子句的简单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结果(如果我在SQL客户机中运行SQL):
|参考|
|123456780678mm |
|123456781678mm |
|123456782678mm |
|123456783678mm|

Java列表结果(在Java调试视图中):
[1,1,1,1]

案例二:
SQL结果:
|参考|
|123456780678mm|

Java列表结果:
[1]

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

有没有办法不使用criteria api就能做到这一点

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

非常感谢你的帮助


Marco

问题是hibernate中的一个bug,它将结果转换为java.lang.Character而不是java.lang.String。结果中仅返回每行的第一个字符

还有一个问题对解决方案进行了更详细的描述:

如果我在查询中使用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")  

附言:我发现参考问题太晚了。对不起

问题是hibernate中的一个bug,它将结果转换为java.lang.Character而不是java.lang.String。结果中仅返回每行的第一个字符

还有一个问题对解决方案进行了更详细的描述:

如果我在查询中使用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")  

附言:我发现参考问题太晚了。对不起

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