@Query:如何手动构建完整的SQL? (Spring JPA)
@Query: How to Build complete SQL manually? (Spring JPA)
我想用 Java 手动构建我的 sql 语句,然后像这样向我的存储库提供最终字符串:
public interface EventRepository extends CrudRepository<Event, Long>{
@Query("?1")
List<Event> getLatestEventsFiltered(String sql);
}
这不起作用,因为它不符合语法...它说:QuerySyntaxException: unexpected token: ?
但是如何实现我的意图呢?
提前致谢!
你不能用 @Query
注释来做到这一点。
首先,我们必须创建一个自定义接口来声明我们的自定义方法:
public interface EventRepository extends CrudRepository<Event, Long> {
List<Event> getLatestEventsFiltered(String sql);
}
public interface EventRepositoryCustom {
List<Event> getLatestEventsFiltered(String sql);
}
接下来,我们将提供 EventRepository
接口的实现:
@Repository
public class EventRepositoryImpl implements EventRepositoryCustom {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Event> getLatestEventsFiltered(String sql) {
Query query = entityManager.createNativeQuery(sql, Event.class);
// You can use alternative query method instead of native query.
List<Event> resultList = (List<Event>) query.getResultList();
return resultList;
}
}
或者,另一种允许您做几乎任何事情的可能性是使用 Specification
API。它允许您以编程方式创建,而不是直接 sql 语句。
我想用 Java 手动构建我的 sql 语句,然后像这样向我的存储库提供最终字符串:
public interface EventRepository extends CrudRepository<Event, Long>{
@Query("?1")
List<Event> getLatestEventsFiltered(String sql);
}
这不起作用,因为它不符合语法...它说:QuerySyntaxException: unexpected token: ?
但是如何实现我的意图呢?
提前致谢!
你不能用 @Query
注释来做到这一点。
首先,我们必须创建一个自定义接口来声明我们的自定义方法:
public interface EventRepository extends CrudRepository<Event, Long> {
List<Event> getLatestEventsFiltered(String sql);
}
public interface EventRepositoryCustom {
List<Event> getLatestEventsFiltered(String sql);
}
接下来,我们将提供 EventRepository
接口的实现:
@Repository
public class EventRepositoryImpl implements EventRepositoryCustom {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Event> getLatestEventsFiltered(String sql) {
Query query = entityManager.createNativeQuery(sql, Event.class);
// You can use alternative query method instead of native query.
List<Event> resultList = (List<Event>) query.getResultList();
return resultList;
}
}
或者,另一种允许您做几乎任何事情的可能性是使用 Specification
API。它允许您以编程方式创建,而不是直接 sql 语句。