我不熟悉Spring,Hibernate和JPA。 问题陈述是打一些报告数据库和表中的记录。我正在使用spring boot创建我的REST应用程序。现在我要从中选择数据的表很大,我不想为该表创建实体需要基于某种条件查询表并选择四列作为输出(约60列)。我试图在我的DAO层中使用javax.persistence.EntityManager解决此问题。但是到处都有我在使用的建议EntityManager实体必须与某些表进行映射。是否有任何方法可以从表中选择结果而不为其生成完整的巨大实体。我基本上想运行一个简单的本机选择查询并获取结果。
从Trade trade_tb trade中选择新的com.xyz.abc.response.TradeInfo(trade.price,trade.ref,trade.nominal),其中trade.date在和之间。
我想在数据库上运行以上查询。
答案 0 :(得分:2)
您可以尝试
使用所需的4个字段创建实体Trade
。
*仅当在Entity中添加了某些字段但在数据库中不存在该字段时,Hibernate才会引发错误。并非如此。
现在您可以编写这样的自定义查询并获取对象
List<Object[]> list = em.createQuery("SELECT t.price, t.ref, t.nominal from Trade t where ... ").getResultList();
for (Object[] obj : list){
System.out.println(obj[0]); // price
System.out.println(obj[1]); // ref
}
OR
将字段包装到自定义对象中,然后将其作为TypedQuery执行。
String query = "SELECT NEW SomeObject(t.price, t.ref, t.nominal) from Trade t where ...";
TypedQuery<SomeObject> typedQuery = em.createQuery(query , SomeObject.class);
List<SomeObject> results = typedQuery.getResultList();
答案 1 :(得分:1)
您提到您不想为巨大的表创建实体。不用了您可以只创建一个仅使用所需列的实体。根据您提供的查询,您将需要类似以下内容(请注意,我实际上并未测试任何一项是否可行,它可能有一些错字):
shell_exec
拥有此实体后,您可以定义如下的存储库接口:
@Entity
@Table(name = "trade_tb")
public class Trade {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Double price;
private String ref;
private Double nominal;
private LocalDate date;
//getters, setters, constructors
}
Spring boot会做一些魔术,并自动实现存储库。您需要做的就是自动连接存储库,您只需在其上调用findByDateBetween方法即可。
如果您真的不想定义任何实体,则将需要本机查询。 (我在文章的底部添加了一个链接,该链接比我能更好地解释了这些内容)。但是查询必须是有效的sql,而查询中却包含一些Java内容。您将需要手动将查询结果映射到一个对象。 顺便说一句,如果您有实体,则可以使用JPQL查询。这些允许语法更接近您的查询,并将自动为您映射到Java对象。
请记住,Hibernate和JPA是用于对象到关系映射的。如果您不打算使用实体,那么最好只使用JDBC。
有关更多信息,请参见
https://spring.io/guides/gs/accessing-data-jpa/
https://thoughts-on-java.org/jpa-native-queries/
https://www.tutorialspoint.com/jpa/jpa_jpql.htm
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
答案 2 :(得分:1)
使用自定义实体管理器查询,您可以直接查询返回ResultSet的表。
从SpringBoot上下文中获取EntityManager。
@PersistenceContext
private EntityManager entityManager;
Query query = entityManager.createQuery("SELECT trade.price,trade.ref,trade.nominal FROM trade_table trade");
List<TradeDO[]> tradeRows = query.getResultList();
对于每个TradeDO,属性的顺序都与SELECT参数的顺序相对应。