我有一个奇怪的问题,我不知道为什么会发生。我肯定我做错了什么,因为这是我第一次使用数据投影,而且我在使用DTOS时从来没有遇到过这样的问题。
我有一个SELECT statemen,它返回各种数据类型的某些列。我有一个接口,我将它传递给JPA存储库,这样它就可以进行接口映射。但是它不是根据列名映射结果(例如'accountnum'->getAccountNumber()
),而是按照字母顺序映射列。因此,如果'date_of_order'是SELECT语句中的第一个,它的值将由getAccountNumber()
返回。
public interface FlatSearchResult {
String getAccountnumber();
UUID getTrackingId;
Date getDateOfOrder;
}
ACCOUNT
- account_id : uuid (pkey)
- accountnumber : string
ORDERS
- order_id : uuid (pkey)
- date_of_order : timestamp
- account_id : uuid (fkey)
TRACKING
- tracking_id : uuid (pkey)
- order_id : uuid (fkey)
我用一个简单的查询定义了一个存储库:
public interface OrderTrackingRepository extends JpaRepository<Account, UUID> {
@Query( nativeQuery = true,
value = "SELECT o.date_of_order, a.accountnumber, t.tracking_id " +
"FROM account as a " +
"INNER JOIN orders as o USING (account_id) " +
"INNER JOIN tracking as t USING (tracking_id) " +
"WHERE a.accountnumber = :acctnum")
<T> Collection<T> findOrderInfoForAccount(@Param("acctnum") acctNumber, Class<T> type);
}
当我调用此方法时,查询将返回正确的行。但是,它不是使用列名映射(例如,date_of_order到getDateOforder()
),而是基于SELECT语句中列的顺序映射到接口中按字母顺序排列的方法。
所以:
SELECT date_of_order, accountnumber, tracking_id
getAccountNumber() -> date_of_order
getDateOfOrder() -> accountnumber
getTrackingId() -> tracking_id
我的数据库是Postgres。我使用的是Spring5.0.2.Release和Spring-Boot 2.0.0.M7。如果需要,我可以调整它们中的任何一个到更新的版本,但没有更老的。我使用C3P00.9.5.2进行连接池,并使用Postgres-9.2-1002.jdbc4。我的所有其他依赖项(hibernate等)都是这个版本的spring-boot所引入的。
不确定这是否是正确的解决方案,因为它只适合80%的描述。但它太长了,不能发表评论。我们开始了。
我想你误解了@osamayaccoub或文档。你的财产名称很好。但是select中的列应该符合java约定。
所以解决这个问题的第一个尝试是
value = "SELECT o.date_of_order as dateOfOrder, a.accountnumber as accountNumber, t.tracking_id as trackingId "
value = "SELECT o.date_of_order as \"dateOfOrder\", a.accountnumber as \"accountNumber\", t.tracking_id as \"trackingId\" "
我不明白的部分是,为什么使用列顺序分配东西。
谢谢你的帮助。我真的不明白我做错了什么。
问题内容: 我一直想知道应该使用哪种类型的投影,所以我做了一点测试,涵盖了5种类型的投影(基于docs:https : //docs.spring.io/spring- data/jpa/docs/current / reference / html /#projections ): 1.实体投影 这只是Spring Data存储库提供的标准。这里没什么好看的。 服务: 实体: 2.构造函数投影
问题内容: 在我的DAO层中,我有一个类似的Find函数 因此,为了读取数据,我必须使用Loop(带有) 我的问题是:是否有任何api框架可以轻松地将其转换为对象列表(例如DQCategoryDTO),而无需使用任何循环,迭代器和调用setter / getter来填充值? 问题答案: 您可以使用ResultTransformer,它可以从别名转换为bean(DTO)属性。对于用法,您可以在此处的
针对不同应用的三维场景需要使用不同的投影方式,比如机械、工业设计领域常常采用正投影(平行投影), 大型游戏场景往往采用透视投影(中心投影)。为了完成三维场景不同的投影方式,three.js封装WebGL API和相关算法,提供了正投影相机OrthographicCamera和透视投影相机PerspectiveCamera。 正投影和透视投影简单解释 下面对正投影相机和透视投影相机的投影算法进行简单