如何在Java运行时中使用Spring执行本地SQL查询?

时间:2019-04-11 14:38:08

标签: java mysql spring jdbc nativequery

那么,有没有什么方法可以从Repository接口执行本机SQL查询?

是的,我知道@Query注释,但是如何执行可以在运行时更改的查询?像使用JDBC executeQuery()方法一样?

3 个答案:

答案 0 :(得分:0)

实施JpaRepository并使用

@PersistenceContext
private EntityManager em;

使用Java的全部功能来创建query类型的string,然后:

 final Query emQuery = em.createNativeQuery(query);
 final List<Object[]> resultList = emQuery.getResultList();

答案 1 :(得分:0)

如果您打算使用Spring Data,则可以执行以下操作:

enum class StringsToKeep(@StringRes stringRes: Int) {
    STRING_KEY(R.string.string_key),
    STRING_KEY_TWO(R.string.string_two),
}

您也可以使用本机查询:

@Query(value = "SELECT p from Person p where r.name = :person_name")
Optional<Person> findPersonByName(@Param("person_name") String personName);

答案 2 :(得分:0)

您可以将规范与JpaRepository一起使用,以在运行时构建动态查询。

将JpaSpecificationExecutor添加到您的JpaRepository接口...

@Repository
public interface MyRepo extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor {
}

然后使用返回规范的静态方法制作一个类。...

public class MyEntitySearchSpec {
  private MyEntitySearchSpec() {
    // Remove this private constructor if need to add public non-static methods.
  }

  public static Specification<MyEntity> myEntitySearch(
      final mysearchCriteria MySearchCriteria) {
    return (root, query, cb) -> {
      List<Predicate> predicates = new ArrayList<>();

      if (mysearchCriteria.isOnlyActive()) {
        predicates.add(cb.isNull(root.get("closeDate")));
      }

      if (mysearchCriteria.getCaseNumber() != null) {
        predicates.add(cb.equal(root.get("caseNumber"),
            mysearchCriteria.getCaseNumber()));
      }

      return cb.and(predicates.toArray(new Predicate[] {}));
    };
  }
}

您可以这样呼叫...

myRepo.findAll(myEntitySearch(mysearchCriteria));