我正在尝试回应...对于我的观点和我的基本测试而言,这只是“最简单的”,您可以展示另一种解决方案来获得赏金。
从“https://stackoverflow.com/q/41880120/287948”上下文开始......而且,由于我使用的是 PostgreSQL(SELECT f(x) 有效),@Query(带有nativeQuery = true)是@Procedure 的解决方法。 ..
此答案的问题:未使用 @Procedure... 在帕特里克的回答之后,我看到(并编辑了这一行)您可以将 @Query 替换为 @Procedure(以及帕特里克指定的其他内容)该方法是一样的!
在现有的域中添加“alien @Query”的三个步骤
任何Spring域都可以使用任何@Query,因此域选择只是一种“房屋组织”和语义,不受您本机SQL代码和domain/repository选择的约束。
在域的domain.repository 包文件中,使用@Query 添加一个方法,并使用其他导入 添加所有查询上下文导入(QueryAnnotation、JpaRepository、query.Param 等,如果需要);
在域的service 包文件中,添加新的自定义“查找”方法定义。
在controll的方法中,调用service中定义的方法。
用真实文件说明
Step1:将新的@Query 添加到现有的存储库文件中,例如。 myprj/address/domain/repository/ICityRepository.java
package com.myprj.address.domain.repository; // old
import com.myprj.address.domain.entity.City; //old
// ... other project's specific (old)
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; // new
import org.springframework.data.repository.query.Param; // new
import org.springframework.data.jpa.repository.query.Procedure; // new
@Repository
public interface ICityRepository extends BaseRepository<City, Long> { //old
Page<City> findByState(State state, Pageable pageable); //old
// here an alien example! (simplest is a call to a constant value)
@Query(nativeQuery = true, value= "SELECT 1234.5678") // NEW!
Double findCustom();
}
外星人就在那里!
Step2:导入存储库并将定义的findCustom() 添加到现有服务文件中,例如。 myprj/address/service/CityService.java
package com.myprj.address.service; // old
import com.myprj.address.domain.entity.City;
// ... other project's specific (old)
@Service
public class CityService
extends BaseService<City, ICityRepository, Long> { // old
@Autowired
public CityService(ICityRepository repository) {super(repository);} // old
public Page<City> findByState(State state, Pageable pageable) {
return repository.findByState(state, pageable);
} // old
public Double findCustom() { return repository.findCustom(); } // NEW!!
}
Step3:将定义的cityService.findCustom() 添加到现有的控制器文件中,例如。 myprj/address/controller/CityController.java ... 是一个虚拟的endpoint,用来测试和显示查询结果,
package com.myprj.address.controller; // old
import com.myprj.address.service.CityService; // reuse old
// ... other project's specific (old)
@RestController // old
@RequestMapping(value = "/zip", produces = "application/json") // old
public class ZipController { // old
@Autowired // old
private CityService cityService; // old, so reuse it
// .. many many endpoints ... OLD
// NEW!!
@RequestMapping(value="/dummy", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public String dummy() {
double x = cityService.findCustom();
return "{\"success\":"+x+"}";
}
}
减少到 2 个步骤和 2 个文件
正如 Patrick 所展示的,您可以将 @Autowired 添加到存储库中进行设置,并直接在 Controller.java 文件中使用 repository.findCustom()。