文章目录

  • 前言
  • 获取entityManager
  • 获取query对象
  • 获取查询结果

前言

最近在使用jpa做新项目,其中涉及到一些动态的数据结构(构建不出model类的)需要查询,因此调研了一下jpa怎么直接使用entityManager跑sql

获取entityManager

正常在spring boot中配置数据库连接之后,直接在需要用的类中加入

@Autowiredprivate EntityManager entityManager;

如果配置了多数据源需要指定注入(网上关于多数据源找到entityManager的教程不少)

获取query对象

看一下EntityManager的底层源码中关于NativeQuery的部分

/** * Create an instance of Query for executing * a native SQL statement, e.g., for update or delete. * If the query is not an update or delete query, query * execution will result in each row of the SQL result * being returned as a result of type Object[] (or a result * of type Object if there is only one column in the select * list.)Column values are returned in the order of their * appearance in the select list and default JDBC type * mappings are applied. * @param sqlString a native SQL query string * @return the new query instance */public Query createNativeQuery(String sqlString);/** * Create an instance of Query for executing * a native SQL query. * @param sqlString a native SQL query string * @param resultClass the class of the resulting instance(s) * @return the new query instance */public Query createNativeQuery(String sqlString, Class resultClass);/** * Create an instance of Query for executing * a native SQL query. * @param sqlString a native SQL query string * @param resultSetMapping the name of the result set mapping * @return the new query instance */public Query createNativeQuery(String sqlString, String resultSetMapping);

第一个很简单,直接输入一个sql语句字符串即可。
第二个是定义一个返回的类结构
第三个是对结果集进行自定义映射

获取查询结果

获取到query对象之后看一下Query类的底层代码

/** * Execute a SELECT query and return the query results * as an untyped List. * @return a list of the results * @throws IllegalStateException if called for a Java * Persistence query language UPDATE or DELETE statement * @throws QueryTimeoutException if the query execution exceeds * the query timeout value set and only the statement is * rolled back * @throws TransactionRequiredException if a lock mode other than * NONE has been set and there is no transaction * or the persistence context has not been joined to the transaction * @throws PessimisticLockException if pessimistic locking * fails and the transaction is rolled back * @throws LockTimeoutException if pessimistic locking * fails and only the statement is rolled back * @throws PersistenceException if the query execution exceeds* the query timeout value set and the transaction* is rolled back*/List getResultList();/** * Execute a SELECT query and return the query results * as an untyped java.util.stream.Stream. * By default this method delegates to getResultList().stream(), * however persistence provider may choose to override this method * to provide additional capabilities. * * @return a stream of the results * @throws IllegalStateException if called for a Java * Persistence query language UPDATE or DELETE statement * @throws QueryTimeoutException if the query execution exceeds * the query timeout value set and only the statement is * rolled back * @throws TransactionRequiredException if a lock mode other than * NONE has been set and there is no transaction * or the persistence context has not been joined to the transaction * @throws PessimisticLockException if pessimistic locking * fails and the transaction is rolled back * @throws LockTimeoutException if pessimistic locking * fails and only the statement is rolled back * @throws PersistenceException if the query execution exceeds * the query timeout value set and the transaction * is rolled back * @see Stream * @see #getResultList() * @since 2.2 */default Stream getResultStream() {return getResultList().stream();}

第一个是直接把结果当作List返回,第二个是将结果当作stream流返回。