在使用JPA2.1和Hibernate 4.3.11实现的Java应用程序中,我试图使用SqlResultSetMapping将本机查询结果映射到实体。查询包括两个具有相同列名的表,因此我需要使用别名并映射它们(在这里描述的问题:http://www.tinesoft.com/java/be-aware-of-mutliple-result-mappings-in-jpa)
为了简化问题,我将查询和实体缩小到最小,这仍然会导致问题。真正的代码使用两个实体和DB函数,这就是使用本机查询而不是JPQL的原因。
网关实体:
@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:
@SqlResultSetMapping(
name = "GatewayWithLoc",
entities = {
@EntityResult( entityClass = Gateway.class , fields = @FieldResult(name = "id", column = "gw_id"))
}
)查询:
Query query = em.createNativeQuery("SELECT gw.id AS gw_id, ..., active, activation_code, ... FROM gateway gw", "GatewayWithLoc");
List<Object[]> rows = query.getResultList();例外:
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.实体),这很难看,很难维护。
发布于 2016-09-01 11:26:00
我认为您需要显式地指定所有的@FieldResult,特别是因为您的列名在两个表之间是相互冲突的。
发布于 2016-08-31 08:02:29
看起来,本机查询不映射到SqlResultSetMapping。查询中的列比映射中的列多得多。查询中选定的列必须与映射匹配。
发布于 2016-08-31 15:03:15
您可以使用SELECT NEW:
https://stackoverflow.com/questions/39243854
复制相似问题