@Query簡単使用


プロジェクトではデータベースとのインタラクションに@QueryとentityManagerを採用していますが、以下に簡単な記述をします.
 
まず@Queryと言いますが、プロジェクトでは次のようにコードしてデータベースからデータを問い合せることができます.
@Query("select mu from MUser mu")
public List<MUser> findUser();

注記@QueryのSQLを実行するにはfindUserメソッドを呼び出します.次に、メソッドを有効にする方法を説明します.
package lee.spring.jpa.query.dao;

import ....

public interface MUserDao extends JpaRepository<MUser, Long>{

	@Query("select mu from MUser mu")
	public List<MUser> findUser();
}

このときMUSerDaoインタフェースの定義は、データベーステーブルにマッピングされたエンティティクラスであるJpaRepositoryを継承することに注意してください.エンティティクラスファイルの作成方法については、説明しません.
次に、springプロファイルにdataSourceを追加する構成を行います.
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:comp/env/jdbc/MySqlDS</value>
    </property>
</bean>

 
 
ここではJNDI方式を採用し、web.xmlファイルに追加
<resource-ref> 
    <description>DBConnection</description> 
    <res-ref-name>jdbc/MySqlDS</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref>

私が使っているサーバーはTomcatで、contextにあります.xmlに追加
 
<Resource name="jdbc/MySqlDS" auth="Container" type="javax.sql.DataSource"
     maxIdle="30" maxActive="10" maxWait="10000" username="root" password="lijiejqq"
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/school"/>

名前とwebに注意してください.xml,springプロファイルの対応,driverとurlは異なるデータベースによって異なり,以上が構成データベース情報である.
 
次にspringプロファイルに追加します
 
<jpa:repositories base-package="lee.spring.jpa.query.dao"
    entity-manager-factory-ref="entityManagerFactory"   />

base-packは、前述のMUSerDaoファイルが存在するパッケージパスで構成されています.
構成にはentityManagerFactoryが使用されているため、entityManagerFactoryの構成も追加されます.
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="users" />
    <property name="persistenceXmlLocation" value="/WEB-INF/persistence.xml" />
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="database" value="MYSQL" />
            <property name="generateDdl" value="false" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
        </bean>
    </property>
</bean>

entityManagerで使用するpersistenceUnitNameとpersistenceXmlLocationは、persistenceを構成します.xmlファイル
このファイルは、アプリケーション内のエンティティのセットの管理と永続性を定義する永続ユニットを構成します.
次は
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="users" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>lee.spring.jpa.query.model.MUser</class>

    </persistence-unit>
</persistence>

コードの使い方を見てみましょう
@Autowired
private MUserDao mUserDao;

public void queryFind(){
	List<MUser> list = mUserDao.findUser();
}

メンバー変数mUserDaoとクエリー方法
これでqueryFindメソッドを呼び出すとデータが検出されます.ここでは簡単な技術で使い方をするだけなので、サービス類はありません.メソッドも戻り値を設定しません.
 
もう一つの方法.entityManagerを使用します.
スプリングプロファイルに追加
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

使用場所
@Autowired
private EntityManager em;

このときクラスメンバー変数は,自動注入方式を採用する
あるメソッドには、先ほどのqueryFindメソッドのように
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM USERS U");
Query query = em.createNativeQuery(sql.toString());
SQLQuery qe = (SQLQuery)((HibernateQuery)query).getHibernateQuery();
qe.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Map<String,Object>> result = query.getResultList();

最後から2行目から3行目は、クエリ結果をmap形式で返すためです.もちろん、エンティティクラスオブジェクトを直接返すなど、他の形式で返すこともできます.パラメータを設定したり、クエリーの数を設定したりすることもできますが、詳細は説明しません.