通常我会使用注释:@Query("SELECT c FROM Country c")
JpaRepository
或预定义方法,例如findAll
但在我的情况下,我想生成动态查询。
String baseQuery =SELECT c FROM Country c`
if(age!=null)
baseQuery+="WHERE c.age=20"
我需要从代码级执行相同的查询,如下所示:
查询q1 = em.createQuery(“SELECT c FROM Country c”);
但我在春季启动时不使用EntityManager
如何从代码级别生成查询?
答案 0 :(得分:0)
如果您想从代码创建动态查询,可以利用Spring的JdbcTemplate
。使用spring引导就像将JdbcOperations bean注入到您的存储库类一样简单(假设您已经为项目提供了spring-boot-starter-jdbc模块)。
但请记住!此解决方案使用SQL,而不是JPQL。这就是为什么你必须在查询中使用正确的表和列名称并将结果正确地映射到对象(即使用RowMapper)
的原因这个简单的例子对我来说很好(有不同的实体,但同样的方式 - 我已经根据你的例子调整了它):
@Repository
public class CountryRepository {
@Autowired
private JdbcOperations jdbcOperations;
private static String BASIC_QUERY = "SELECT * FROM COUNTRY";
public List<Country> selectCoutry(Long age){
String query = BASIC_QUERY;
if (age != null){
query += " WHERE AGE = ";
query += age.toString();
}
//let's pretend that Country has constructor Conutry(String name, int age)
return jdbcOperations.query(query, (rs, rowNum) ->
{ return new Country(rs.getString("NAME"), rs.getInt("AGE");}
);
};
}
然后在服务或任何你注入CountryRepository和调用方法。
答案 1 :(得分:-1)
由于您使用的是Spring Boot,因此可以使用Spring Data在存储库中创建查询:
outfile=''
不是100%的语法,但应该是类似的东西。 现在你可以 autowire 这个类了:
@Repository
public interface CountryRepository extends JpaRepository<Country, Long> {
}
您可以使用所有基本方法:
@Autowired
public CountryRepository countryRepo;
如果要进行更高级的查询,可以使用Spring Data,例如:
countryRepo.findOne(id);
countryRepo.find();
这只是一个例子(一个愚蠢的例子),当然假设你的@Repository
public interface CountryRepository extends JpaRepository<Country, Long> {
public Country findByNameAndContinent(String name, String continent);
}
类有字段名'name'和'continent',两者都是字符串。更多信息请点击此处:
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
第5.3节更具体。
PS:确保您的Country
班级有Country
注释