【问题标题】:different result by executing query in console and namedQuery通过在控制台和 namedQuery 中执行查询得到不同的结果
【发布时间】:2020-02-07 15:45:49
【问题描述】:

在我的 java web 应用程序中,我需要通过 customerNumber 从名为 VwDepositsInfo 的视图中查询存款列表。

当我执行查询时:

select * from VW_DEPOSIT_INFO v where v.CUSTOMER_NUMBER=:customerNo

在数据库控制台中,我的 resultList 大小为 2,并且有这样的内容:

1-{depositTypeDesc="shortTerm"} {depositTypeCode="850"}

2-{depositTypeDesc="longTerm"} {depositTypeCode="2"}

但是当我测试包含 namedQuery 的代码时:

    @NamedQuery(
        name = "inquireAccountByCustomerNumber",
         query = "select c from VWDepositInfo c where c.customerNumber=:customerNo"
            )

我得到一个大小为 2 的结果列表,但两者都一样,像这样:

1-{depositTypeDesc="shortTerm"} {depositTypeCode="850"}

2-{depositTypeDesc="shortTerm"} {depositTypeCode="850"}

当我通过定义结果类使其成为 nativeQuery 时:

Query query = entityManager.createNativeQuery("select * from VW_DEPOSIT_INFO v where v.CUSTOMER_NUMBER=:customerNo", VWDepositInfo.class);

我又得到了错误的结果。

最后我在没有定义结果类的情况下尝试了 nativeQuery:

Query query = entityManager.createNativeQuery("select * from VW_DEPOSIT_INFO v where v.CUSTOMER_NUMBER=:customerNo");    

结果和我预期的一样。

这是我的 VwDepositsInfo.class:

@Entity
@Table(name = "VW_DEPOSIT_INFO")
@Audited(withModifiedFlag = false)
@NamedQueries(
    {@NamedQuery(
            name = "inquireAccountByCustomerNumber",
            query = "select c from VWDepositInfo c where c.customerNumber=:customerNo"
    )
    }
)
public class VWDepositInfo implements Serializable {

@Id
@Column(name = "CUSTOMER_NUMBER")
private Long customerNumber;

@Column(name = "BRANCH_CODE")
private Long branchCode;

@Column(name = "DEPOSIT_TYPE_CODE")
private Long depositTypeCode;

@Column(name = "DEPOSIT_SERIAL")
private Long depositSerial;

@Column(name = "DEPOSIT_TYPE_DESC")
private String depositTypeDesc;

@Column(name = "CURRENCY_TYPE_DESC")
private String currencyTypeDesc;

@Column(name = "DEPOSIT_OPEN_DATE")
private Date depositOpenDate;

有人知道为什么会这样吗???

【问题讨论】:

  • 没有您的实际VWDepositInfo 这是不可能的。 JPQL 根据VWDepositInfo 中的映射被翻译成SQL。检查执行的查询,这可能与您的普通 SQL 查询不同。还要确保你有正确的equalshashCode 方法。
  • @M.Deinum 我已经添加了课程

标签: java hibernate named-query nativequery


【解决方案1】:

大众 = 查看? 您可能需要指定主密钥

将@id 用于唯一字段:)

您可能需要多个带有@id 的字段才能获得唯一的行。

例如 DEPOSIT_TYPE_CODE 和 customerNumber

【讨论】:

  • 我的班级有@id
  • 我的意思不仅仅是 customerNumber
  • 没错,在更多字段上使用更多@id 使我的行独一无二,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2012-06-10
  • 2020-11-12
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多