我创建了一个Spring项目,我想在一个文件上创建多个查询。谷歌搜索后,我发现此链接https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-creating-database-queries-with-named-queries/
所以,我应该创建文件orm.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<named-query name="Todo.findByTitleIs">
<query>SELECT t FROM Todo t WHERE t.title = 'title'</query>
</named-query>
</entity-mappings>
然后,界面TodoRepository.java
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import java.util.List;
interface TodoRepository extends Repository<Todo, Long> {
@Query(nativeQuery = true)
public List<Todo> findByTitleIs();
}
spring.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="employeeDAO" class="com.journaldev.spring.jdbc.dao.EmployeeDAOImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="employeeDAOJDBCTemplate" class="com.journaldev.spring.jdbc.dao.EmployeeDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="todoRepositoryBean" class="com.journaldev.spring.jdbc.dao.TodoRepositoryBeanImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/springdb" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
</beans>
班级SpringMain.java
是:
public class SpringMain {
public static void main(String[] args)
{
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
EmployeeDAO employeeDAO = ctx.getBean("todoRepositoryBean", EmployeeDAO.class);
List<Employee> les = employeeDAO.getAll();
System.out.println("The list size is: + les.size()");
ctx.close();
}
}
我认为它很有用,但我发现了一个问题:如何在Todo.findByTitleIs
类上使用命名查询main
?
答案 0 :(得分:2)
Petri Kainulainen的教程非常好,您应该通过阅读本文来实现目标:
他解释了如何实现TodoRepository类。
要使用存储库中定义的查询,如果您正在开发其他Web应用程序,则可以使用@Controller
类来处理单个功能(例如 TodoController )。在控制器中,您可以自动装配存储库:
@Autowired
private TodoRepository todoRepository;
然后在你的方法中使用它:
public void doSomething() {
List<Todo> todoList = todoRepository.findByTitleIs();
}
请记住,您只能在Spring托管类(存储库,服务,控制器,组件,配置ecc)中自动装配bean
否则您可以直接从 ApplicationContext 获取存储库,但不建议这样做:
Why is Spring's ApplicationContext.getBean considered bad?
我个人只将此方法用于测试目的(创建主测试类)。
然后我建议你直接在存储库界面编写查询,对我来说它简单得多(这样你可以避免使用orm.xml文件)。例如:
@Repository
public interface TodoRepository extends JpaRepository<Todo, Long> {
// define your custom query
@Query("SELECT t FROM Todo t WHERE t.title = :title")
public List<Todo> findByTitleIs(@Param("title") String title);
// write here all the Todo queries
}
您还可以使用方法名称机制创建查询,并像以下一样编写上一个查询:
public List<Todo> findByTitle(String title);
http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html