gpt4 book ai didi

Java JPA Hibernate SqlResultSetMapping 别名

转载 作者:行者123 更新时间:2023-11-29 12:25:39 24 4
gpt4 key购买 nike

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

为了简单起见,我将查询和实体缩小到最小,这仍然会导致问题。实际代码使用两个实体和 DB 函数,这是使用 native 查询而不是 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();

异常(exception):

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)
...

如果我在 SqlResultSetMapping 中使用没有 fields = @FieldResult...SELECT *,代码会按预期工作,但我不能这样做是因为不同表中的列名相同。

我将通过手动将结果映射到实体来解决这个问题,因为我需要快速解决方案,但如果我做错了什么或者 Hibernate 不支持我正在尝试做的事情,那将是很好的了解。 “Pro JPA 2”一书包含非常相似的示例,应该可以正常工作。

更新:使用 Hibernate 5.1.1 (Spring 4.3.2) 测试 - 结果相同

更新:看起来所有列名都需要指定,如多个答案中所述。对我来说,这似乎是 JPA/Hibernate 的一个大问题——这些列名可以从实体派生,只有手动指定的异常(exception)。相反,我需要写 3 次列名(1. 查询,2. 结果集映射 3. 实体),这很丑陋且难以维护。

最佳答案

我认为您需要明确指定所有 @FieldResult,尤其是因为您的列名在两个表之间存在冲突。

关于Java JPA Hibernate SqlResultSetMapping 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com