我对Spring的JdbcTemplate
对象(以及一般的spring-jdbc)非常熟悉,我真的很喜欢编写SQL并自己处理对象映射。
但是最近我正在使用CrudRepository
界面,我真的很喜欢它。
也就是说,在涉及复杂查询(联接等)时,我仍然喜欢编写自己的SQL查询。
我希望能够在也有CrudRepository
实例的类中使用JdbcTemplate
方法,这样我就可以使用CrudRepository
的现成方法能够编写自己的复杂SQL并将其与JdbcTemplate
一起使用。
当然,问题在于CrudRepository
只是一个接口,而JdbcTemplate
是常规类。所以问题是
JdbcTemplate
实例的类,而该实例也提供CrudRepository
的实现,而不必费解太多了吗?答案 0 :(得分:1)
在任何应用程序中都非常可能混合JPA和JDBC。 JdbcTemplate
可用于编写复杂的查询或进行更复杂的自定义映射。另一种选择是使用RowCallbackHandler
(而不是RowMapper
直接将某些内容流式传输到文件或其他资源以保留内存)。
使用Spring Data时,可以使用@Query
批注在存储库中编写自定义查询。这可以是本机查询或JPQL。
但是,在Spring中,没有什么可以阻止您在单个类中同时使用它们。您可以将存储库以及JdbcTemplate
直接注入服务(或者,也可以根据需要将其放置在另一个立面之后)。
@Service
@Transactional
public class YourService {
private final YourCrudRepository repo;
private final JdbcTemplate jdbc;
public YourService(YourCrudRepository repo, JdbcTemplate jdbc) {
this.repo=repo;
this.jdbc=jdbc;
}
// Your methods go down here
}
现在您可以同时使用两者。关于Spring的好处是,无论使用CrudRepository
还是JdbcTemplate
,它都会抛出相同的异常DataAccessException
。如果它们在相同的DataSource
上进行操作,则单个JpaTransactionManager
就足以管理连接和事务。
答案 1 :(得分:0)
为什么不只是将它们用作成员?
grid.getEditorFieldGroup().addCommitHandler(new FieldGroup.CommitHandler() {
@Override
public void preCommit(FieldGroup.CommitEvent commitEvent) throws
FieldGroup.CommitException {
BeanItem item = (BeanItem)
commitEvent.getFieldBinder().getItemDataSource();
MyClass qm = (MyClass) item.getBean();
grid.getColumn("myColumn").
setEditorField(generateMachineCode(qm.myColumnValue());
}
private Field << ? > generateMachineCode(String machineCode) {
TextField editableTextFiled = new TextField();
editableTextFiled.setEnabled(true);
if (StringUtils.isNotEmpty(machineCode) && !machineCode.equals("12345")) {
editableTextFiled.addValidator(new StringLengthValidator("It must be 6
characters ", 6, 6, false));
}
}
}
当然,您将需要通过所有方法,这很嘈杂。 public class MyDao {
private JdbcTemplate template;
private CrudRepository repository;
}
将是原型 D ata A 事件 O 对象。