首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java SqlResultSetMapping别名

Java SqlResultSetMapping别名
EN

Stack Overflow用户
提问于 2016-08-31 07:57:30
回答 3查看 2.7K关注 0票数 2

在使用JPA2.1和Hibernate 4.3.11实现的Java应用程序中,我试图使用SqlResultSetMapping将本机查询结果映射到实体。查询包括两个具有相同列名的表,因此我需要使用别名并映射它们(在这里描述的问题:http://www.tinesoft.com/java/be-aware-of-mutliple-result-mappings-in-jpa)

为了简化问题,我将查询和实体缩小到最小,这仍然会导致问题。真正的代码使用两个实体和DB函数,这就是使用本机查询而不是JPQL的原因。

网关实体:

代码语言:javascript
复制
@Entity
public class Gateway implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Integer active;
    ...
    @Column(name = "activation_code")
    private String activationCode;
    ...
}

SqlResultSetMapping:

代码语言:javascript
复制
@SqlResultSetMapping(
        name = "GatewayWithLoc",
        entities = {
            @EntityResult( entityClass = Gateway.class , fields =     @FieldResult(name = "id", column = "gw_id"))
        }
)

查询:

代码语言:javascript
复制
Query query = em.createNativeQuery("SELECT gw.id AS gw_id, ..., active, activation_code, ... FROM gateway gw", "GatewayWithLoc");
List<Object[]> rows = query.getResultList();

例外:

代码语言:javascript
复制
Caused by: org.postgresql.util.PSQLException: The column name activati2_1_0_ was not found in this ResultSet.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2803)
...

如果我在SELECT *中使用不带fields = @FieldResult...SqlResultSetMapping,代码可以正常工作,但由于不同表中的列名相同,所以不能这样做。

我将通过手动将结果映射到实体来解决这个问题,因为我需要快速的解决方案,但是最好知道我是否做错了什么,或者Hibernate不支持我想做的事情。书“临JPA 2”包含了非常类似的例子,应该是可行的。

更新:使用Hibernate 5.1.1 (Spring4.3.2)测试-结果相同

更新:看起来所有的列名都需要像多个答案中提到的那样指定。在我看来,这似乎是JPA/Hibernate的一个大问题--这些列名可以从实体派生出来,只有手动指定的例外情况。相反,我需要写3次列名(1.查询,2.结果集映射3.实体),这很难看,很难维护。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-01 11:26:00

我认为您需要显式地指定所有的@FieldResult,特别是因为您的列名在两个表之间是相互冲突的。

票数 0
EN

Stack Overflow用户

发布于 2016-08-31 08:02:29

看起来,本机查询不映射到SqlResultSetMapping。查询中的列比映射中的列多得多。查询中选定的列必须与映射匹配。

票数 0
EN

Stack Overflow用户

发布于 2016-08-31 15:03:15

您可以使用SELECT NEW

  1. 创建类时,需要在查询中使用所有列。 包dz.my;公共类GatewayGatewayWithLoc {私有整数idGw;私有整数activeGw;私有整数idGwWl;私有整数activeGwWl;公共GatewayGatewayWithLoc(Integer idGw,Integer activeGw,Integer idGwWl,Integer activeGwWl) { this.idGw = idGw;this.activeGw = activeGw;this.idGwWl = idGwWl;activeGw=idGwWl;}.// getter and setter……}
  2. 使用查询 query =em.createQuery(“从网关gw中选择新的dz.my.GatewayGatewayWithLoc(gw.id、gw.active、gwwl.id、gwwl.active)”;List liste = query.getResultList();//显示回答(GatewayGatewayWithLoc gwgw : liste) { System.out.println("GatewayGatewayWithLoc:“+ gwgw.getIdGw() +”+ gwgw.getActiveGw()+“+ gwgw.getIdGwWl()+ gwgw.getActiveGwWl();})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39243854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档