2013-05-07 101 views
0

您好我有一个如下定义的namedquery,但是当我执行它时,它会重新调整整个对象而不仅仅是我请求的字段。当我只想返回该对象的一列时,是否有我缺少的东西。在此先感谢NamedQuery返回对象而不是列

@NamedQueries ({ 
@NamedQuery(
      name="findSubmissionForSubmissionRowUniqueBankId", 
      query="SELECT o.submission FROM SubmissionRow o WHERE  o.uniqueBankId = :uniqueBankId", 
      hints={@QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
       @QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_SIZE, value="1000"), 
       @QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_EXPIRY, value="18000") 
      }) 

})

它excecutes这个查询的SQL是

EJBQueryImpl(ReadObjectQuery(name="findSubmissionForSubmissionRowUniqueBankId" referenceClass=SubmissionRow sql="SELECT ID, ARCHIVE_BANK_ID, EXTERNAL_SOURCE_DETAILS,UNIQUE_BANK_ID, SUBMISSION_ID FROM FE_TEST.SUBMISSION_ROW WHERE (UNIQUE_BANK_ID = ?)")) 

我已经定义了加入成为folllows

@ManyToOne 
@JoinColumn(name = "SUBMISSION_ID", referencedColumnName = "ID") 
private Submission submission; 
+2

我明白'o.submission'是一个bean,而不是一个原始类型/字符串/日期,是吗?在这种情况下,您将按照要求获得“提交”对象(稍后您可以从其属性获取该ID)。也许你可以尝试'o.submission.id',如果这是你想要的。 – SJuan76 2013-05-07 10:42:59

+0

是提交是一个bean,但即使我试图获得一个非bean属性,它仍然返回整个submissionrow对象,而不仅仅是那个porperty – user1107753 2013-05-07 11:22:12

+0

你试过'SELECT o.submission.theProperty ...'? – SJuan76 2013-05-07 11:36:12

回答

1

您提示不有道理,

@QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_SIZE, value="1000"), 
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_EXPIRY, value="18000") 

你似乎认为你正在使用查询缓存,但不是。 CACHE_USAGE不启用查询缓存,但是在内存中查询(在整个缓存中搜索对象)。

要启用查询缓存,请使用QueryHints.QUERY_RESULTS_CACHE = true。

删除CACHE_USAGE。 CACHE_USAGE内存查询只支持整个对象,不支持选择部分。如果你想使用内存查询,只需查询整个对象,然后访问你想要的部分。

+0

你也可以记录一个错误,以通过部分查询支持内存查询。 – James 2013-05-07 14:00:22

相关问题