SpringのHibernate連携で条件指定delete方法

このQ&Aのポイント
  • SpringのHibernate連携で条件指定delete方法についてまとめました。
  • HibernateTemplateを使用して条件付deleteやupdateはできません。
  • 条件付deleteを実現する方法についても説明します。
回答を見る
  • ベストアンサー

SpringのHibernate連携での条件指定delete

お世話になります。 spring-framework-1.2.8 hibernate-3.1 でwebアプリの開発を行っております。 宣言的トランザクション管理でDAO作成するために、 HibernateTemplate(org.springframework.orm.hibernate3.support.HibernateDaoSupport#getHibernateTemplate()で取得しています) の各種メソッドでDBアクセスしていますが、条件付delete発行の方法がわかりません。 find()にはクエリ文字列を渡して検索するメソッドがあるのですが、delete()やupdate()にはクエリ文字列を受け取るメソッドがないようです。 HibernateTemplateを使用して条件付delete(SQLのdelete form xxx where xx=x の発行)やupdateは出来ないのでしょうか。 また、条件付deleteはどのように実現すればよいのでしょうか。 よろしくお願いします。

noname#60875
noname#60875
  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • nobutame
  • ベストアンサー率16% (3/18)
回答No.1

まったく自信ないですが、こんな感じで出来ないでしょうか? getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { int deletedEntities = session.createQuery("delete A where A.id>10").executeUpdate(); return null; } });

noname#60875
質問者

お礼

ありがとうございます。 お教えいただいた方法を、明日試させていただきます。 追って結果をご報告させていただきます。

noname#60875
質問者

補足

お教えいただいたとおり、以下のメソッドで実現できました。 本当にありがとうございます。 が、そもそもこのようなメソッドはhibernate的(Spring的?)ではなかったりするのでしょうか。 通常こういった要件(条件指定で一括削除)の場合はどうするのがよいのでしょうか。 たとえば、findで削除対象を検索した後、getHibernateTemplate().delete(Object);を繰り返すとか、deleteAll(Collection)で削除するほうがようのでしょうか。   public int deleteAttendances(final String uid, final String dateYm) {     Object ret = getHibernateTemplate().execute(new HibernateCallback() {       public Object doInHibernate(Session session)           throws HibernateException {         Query query = session.createQuery(             "delete Attendance a where a.comp_id.uid = ? and a.comp_id.dateYm = ?");         query.setString(0, uid);         query.setString(1, dateYm);         int deletedEntities = query.executeUpdate();         return new Integer(deletedEntities);       }     });     return ((Integer) ret).intValue();   }

関連するQ&A

  • Hibernate&Springによる宣言的トランザクション管理

    現在、下記の書籍を参考にしHibernate&Springを利用したアプリを開発しているのですが、宣言的トランザクション管理がうまく機能していません。 オープンソースJavaプロダクツ http://www.gihyo.co.jp/books/syoseki-query.php/4-7741-1998-9 試しに、特集5のサンプルを動かしテストしてみたのですが、やはりトランザクションが思った通りに機能しませんでした。 どなたかサンプルを実行した方はいらっしゃいますでしょうか?また、その際トランザクションがちゃんと機能していたか教えていただけないでしょうか? ちなみにテストの仕方としては、 1 CustomerDAOにてsaveメソッドを定義 2 CustomerImplでオーバーライド 3 save()内でgetHibernateTemplate().save()を実行。その際引数として適当な文字列を渡す。 例 : getHibernateTemplate().save("test") 4 SaveCustomerAction.executeで以下のコードを実行 customerDAO.saveOrUpdate(customer); customerDAO.save(customer); この時updateで例外が発生するのでrollbackして欲しいのですが、commitしてしまいます。 テストの仕方もこんなやり方でいいのか?と思いましたが、何か分かる方がいらっしゃいましたら情報の提供よろしくお願い致します。

    • ベストアンサー
    • Java
  • Spring MVC + Thymeleaf

    Spring MVC + Thymeleafを勉強している中で、下記のサイトを参考に勉強しておりますが、 どうしてもエラーが解消されなく、投稿させていただきました。 ◼︎環境 mac 10.10.4 eclipse 4.4 tomcat 8.0.21 java 1.8.0_31 mysql 5.6.25 pom.xml 内設定(一部抜粋) <!-- Spring / Hibernate version --> <version.spring>4.2.0.RELEASE</version.spring> <version.spring.data>1.8.2.RELEASE</version.spring.data> <version.spring.boot>1.2.5.RELEASE</version.spring.boot> <version.hibernate>4.3.5.FINAL</version.hibernate> <version.aopalliance>1.0</version.aopalliance> <version.thymeleaf>2.1.4.RELEASE</version.thymeleaf> <!-- Test --> <version.junit>4.11</version.junit> <version.dbunit>2.4.9</version.dbunit> <!-- Hibernate and JPA --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${version.hibernate}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${version.hibernate}</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> <version>2.0-cr-1</version> </dependency> <!-- JSR 303 with Hibernate Validator --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.0.Final</version> </dependency> ◼︎参考サイト http://brissyu.blogspot.jp/2014/07/spring-mvc-thymeleaf-web003.html ◼︎問題 上記サイトで、DBテストを実施しておりますが下記エラーが表示されてしまう。 2015/08/02 14:16:56:386 WARN - AnnotationConfigWebApplicationContext.refresh Exception encountered during context initialization - cancelling refresh attempt org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/base/init/DbConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence ◼︎試したこと バージョンなど、参考サイト(http://brissyu.blogspot.jp/2014/07/spring-mvc-thymeleaf-web001.html)に合わせて、検証もしましたがpoxの設定でHibernate 4.1.9.FINALを設定しましたが、エラーになり現状のバージョンで設定で実施しております。 お手数をお掛けいたしますが、上記解決方法のご教授をお願いいたします。

  • Struts、Spring、iBATISについて

    Struts1、Spring3、iBATIS2 であるプロジェクトを 勉強の為に作成しているのですが、どうしても わからないエラーが発生してしまい、質問させて いただきました。 【現象】 eclipseによりtomcatを使用してサーバサービスを起動のとき、 エラーが発生してしまう。 【applicationContext.xml】抜粋 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sqlMapConfig.xml" /> <property name="dataSource" ref="dataSource" /> </bean> <bean id="jtaTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="testDAO" class="bestone.app.dao.impl.testDAOImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> 【testDAOImpl.java】 package bestone.app.dao.impl; import java.sql.SQLException; import bestone.app.dao.testDAO; import bestone.app.dao.bean.testBean; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; public class testDAOImpl extends SqlMapClientDaoSupport implements itestDAO { public testBean selectInfo(testBean bean) throws SQLException { // TODO Auto-generated method stub return (testBean) getSqlMapClient().queryForObject("test.SELECT_INFO", bean); } } 【エラー内容】 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: ServletContext resource [/WEB-INF/conf/sqlMapConfig.xml]; nested exception is com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'. Cause: java.io.IOException: Could not find resource jp/co/best/app/dao/map/test_SqlMap.xml at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1403) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222).............................. ======================================= わかる方いらっしゃいましたらご教授ください。 よろしくお願いいたします。

  • select文の条件指定

    PHPを使ってMySQLを検索するアプリを開発しています。 Select文の検索で以下のように検索条件を指定しています。 $query= "SELECT * FROM registration_tbl WHERE DATEDIFF(LAST_DAY(".$previousyear."),date) > 0 AND delete_flg = 0 ORDER BY date ASC ;" ; $res = $db->query($query); 上記の$query文字列の中の$previousyearには日付データが格納されています(確認済)。 意図としては$previousyearが示す月の月末日と、registration_tblのdateカラムとを比較して、dateの方が時期的に遅い(現時点に近い)レコードをselectしたいわけです。 なぜかこのクエリ文をMySQLに投げてもレコードがまったく検索できません。 もちろん該当するデータは10以上あることはphpMyAdminで確認すみです。そして、他の検索条件の場合にはちゃんと検索します。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの DELETE文を関数で実現するアイデア?

     当方、エクセルは一度も操作したことがありません。それなのに 1、クロス集計クエリーをエクセルで実現する。 2、ユニオンクエリ―をエクセルで実現する。 3、SQL言語で全ての操作を実現する。  以上をVBAコードやマクロを使わないで式(関数)一発で可能とするに挑戦中。 1、クエリーの結果をシートに表示する。 2、Delete文の実行を可能にする。 【質問】SQLの DELETE文を関数で実現するアイデアとは? 今、私が、考えているアイデアは、 Step1:削除対象の先頭列に"#delete"を書き込むUpdate文を実行する。 Step2:先頭列に"#delete"のある行を、エクセルの.Delete で削除する。 Step2の対案: 先頭列に"#delete"のある行を不要行と見做して必要行を繰り上げて詰める。  エクセルユーザーが、《テーブルシート》《データ入力シート》《レポートシート》という考えでシート設計していれば、現行の有力候補でOKだと思います。が、「あくまでもテーブルの行だけを削除しなきゃーダメ1」と言われれば、対案を考えざるを得ません。  で、皆さん、グッドアイデアはありませんか?

  • エクセルの条件付書式の設定にて

    エクセルの条件付書式の設定にて条件に合う時に、 セルの塗りつぶしをしています。 合わせて、任意の文字列を設定することはできますか?

  • Excelの条件付書式について

    条件付書式について教えてください。 セルに文字列が入っているのですが、たとえば「Aファイル」「Bファイル」など「ファイル」という文字を含むものすべてに書式をつけることはできますでしょうか?「="ファイル"」という条件にするとだめですよね。 よろしくお願い致します。

  • 条件付書式

    エクセルで条件付書式を数式で入力しています。 =COUNTIF(N26:BK50,A82) 例えば上記のような形で入力を行なっていますが このN26:BK50の中で赤色の文字だけに 条件付書式を当てはめる事はできないでしょうか? どなたか分かる方宜しくお願いします。 どうしても数ある同じ文字列の中で赤色のA82だけを捜してきたいのですが・・・

  • エクセルの『条件付書式』について

    エクセルの『条件付書式の設定』についてご教示下さい。 F列の、 条件1:「G*」「F*」「C*」「D*」「I*」「J*」が含まれる場合背景をブルーに 条件2:「E*」「H*」「K*」が含まれる場合背景をピンクに。 条件3:「L*」「M*」「N*」「o*」が含まれる場合、背景を紫に。 ※「G*」とは、GOLD など、一番初めにGという文字がつく場合の文字列の事です。 条件のとおり、文字が含まれる場合背景を変えたいのですが、 数式、セルの値と色々試しましたが、条件1と条件2がうまくいきません。 また、F列以外にもG列H列もF列の条件で背景色を変動させてたいと 考えている為、なるべくVBAには頼らず、条件付書式で設定したいと考えております。 ご存知の方いらっしゃいましたら。お教えいただけますでしょうか。 よろしくお願い致します。

  • Struts2、Spring、iBATIS splMapClientについて

    Struts2、Spring、iBATIS で勤務管理サイトを 勉強の為に作成しているのですが、どうしても わからないエラーが発生してしまい、質問させて いただきました。 【事象】 ・eclipseよりサーバでの実行を起動させた際ですが、  @ResourceでDAOのBeanを注入時にエラーが発生してしまいます。  ※@Resourceを外せば当事象のエラーは発生しませんでした。 【applicationContext.xml】抜粋 <bean id="splMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" scope="singleton"> <property name="configLocation" value="classpath:sqlMapConfig.xml"/> <property name="dataSource" ref="dataSource"/> </bean> <bean id="loginDao" class="login.LoginDao" scope="singleton"> <property name="splMapClient" ref="splMapClient"></property> </bean> 【sqlMapConfig.xml】 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <settings cacheModelsEnabled="true" statementCachingEnabled="true" enhancementEnabled="true" classInfoCacheEnabled="true" lazyLoadingEnabled="false" /> <sqlMap url="file:c:/eclipse/workspace/tiles/WebContent/WEB-INF/sql/login.xml" /> </sqlMapConfig> 【Login.java】 package login; import java.util.Map; import javax.annotation.Resource; import jp.co.hershe.struts2.util.Struts2Action; import com.opensymphony.xwork2.ActionSupport; @Struts2Action("Login") public class Login extends ActionSupport { private static final long serialVersionUID = 1L; @Resource private LoginDao loginDao; @Override public String execute() throws Exception { (もろもろ処理が入ります) } } 【エラーログ】 情報: Loaded JDBC driver: oracle.jdbc.driver.OracleDriver 2009/06/26 1:05:28 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 情報: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@269997: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,Login,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,login,transactionManager,dataSource,TransactionInterceptor,splMapClient,loginDao]; root of factory hierarchy 2009/06/26 1:05:28 org.springframework.web.context.ContextLoader initWebApplicationContext 致命的: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginDao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'splMapClient' of bean class [login.LoginDao]: No property 'splMapClient' found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) at …… ================================================== sqlMapClientのあたりで記述がおかしいのかと思いまして 見直しや検索などしてみたのですが、わからず、、 わかる方いらっしゃいましたらご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう