Spring上的多个命名查询

时间:2016-08-28 17:30:12

标签: java spring spring-mvc jpa

我创建了一个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

1 个答案:

答案 0 :(得分:2)

Petri Kainulainen的教程非常好,您应该通过阅读本文来实现目标:

https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-eight-adding-functionality-to-a-repository/

他解释了如何实现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