『壹』 spring jpa 是怎麼自動實現的
如果我們想拓展spring data jpa的CrudRepository或PagingAndSortingRepository,加入我們自己的database操作。分3個級別的拓展:
1、繼承CrudRepository或PagingAndSortingRepository,在繼承的就扣定義findBy**類似的方法。這種方式只能做到最簡單的拓展,畢竟一個方法名能表達的意思有限,(就好比我們說一句話能表達的意思也很有限)。
2、使用@Query註解繼承介面裡面的方法,定義方法要執行的sql,注意方法的每個參數對應sql里的「1?」、「2?」、……參數。這種方法比上一種方法能完成更多的拓展,可以連表,定義子查詢等,但是還是只能執行一個sql語句。
3、使用@NoRepositoryBean,定義非倉庫bean:
[java] view plain
@NoRepositoryBean
interface BaseRepository<T> extends CrudRepository<T, Long> {
long customMethod();
}
實現上面的介面里定義的方法
[java] view plain
/**
* @author Oliver Gierke
* @soundtrack Elen - Nobody Else (Elen)
*/
class ExtendedJpaRepository<T> extends SimpleJpaRepository<T, Long> implements BaseRepository<T> {
/**
* Creates a new {@link ExtendedJpaRepository} for the given {@link JpaEntityInformation} and {@link EntityManager}.
*
* @param entityInformation must not be {@literal null}.
* @param entityManager must not be {@literal null}.
*/
public ExtendedJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
/*
* (non-Javadoc)
* @see example.springdata.jpa.customall.BaseRepository#customMethod()
*/
@Override
public long customMethod() {
//do some database operation
return 0;
}
}
最後定義我們的倉庫bean介面,讓這個介面繼承我們新的倉庫介面而不是CrudRepository或PagingAndSortingRepository
[java] view plain
public interface UserRepository extends BaseRepository<User> {}
第三種方式的拓展就非常強大了,在一個方法裡面可以想干什麼就干什麼了,執行多個語句,執行存儲過程等。另外上述三種方式是可以結合在一起使用的,並不沖突。
『貳』 JPA如果調用ORACLE中的函數,跟調用存儲過程不一樣哦,我把函數換成存儲過程做了,以下是調用存儲過程的
我覺得Oracle定義存儲過程和函數主要是為了解決比較復雜的功能。是SQL語句的集合。
@Entity
@Table(name = "USER", schema = "MOBILE", uniqueConstraints = {
@UniqueConstraint(columnNames = { "LOGINID" }),
@UniqueConstraint(columnNames = { "USERACCOUNT" }) })
@NamedNativeQuery(name = "addUser", query = "{call addUser(:pPortalID,:ploginid,:ploginpasswd,:pSelfQuiz,:pSelfAnswer,:pUserEmail,:pUserAccount,:pUserPin)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }, resultClass = User.class)
public class User implements java.io.Serializable {
『肆』 如何在JPA的po類中調用存儲過程和函數
在項目開發中用到了JPA規范,並在po類中使用了存儲過程,這種資料在網上很容易找到,所以很快就跑通了,代碼如下:
@Entity
@Table(name = "USER", schema = "MOBILE", uniqueConstraints = {
@UniqueConstraint(columnNames = { "LOGINID" }),
@UniqueConstraint(columnNames = { "USERACCOUNT" }) })
@NamedNativeQuery(name = "addUser", query = "{call addUser(:pPortalID,:ploginid,:ploginpasswd,:pSelfQuiz,:pSelfAnswer,:pUserEmail,:pUserAccount,:pUserPin)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }, resultClass = User.class)
public class User implements java.io.Serializable {
private static final long serialVersionUID = 5325039036880950119L;
private String userid;
private String loginid;
private String passwd;
//省略若干代碼
}
但是後來卻要求將addUser改成了函數,所以也要將po類中的調用修改。起初我以為很簡單,資料庫中的存儲過程和函數差不多,不用修改直接調用即可。但是事實卻不像我想得那樣,錯誤百出,我上網查了很多資料,但是沒有能給出答案的,後來才知道只要修改一個地方就可以獲得想要的功能,郁悶!
下面是修改後的代碼:
@Entity
@Table(name = "USER", schema = "MOBILE", uniqueConstraints = {
@UniqueConstraint(columnNames = { "LOGINID" }),
@UniqueConstraint(columnNames = { "USERACCOUNT" }) })
@NamedNativeQuery(name = "addUser", query = "{?=call addUser(:pPortalID,:ploginid,:ploginpasswd,:pSelfQuiz,:pSelfAnswer,:pUserEmail,:pUserAccount,:pUserPin)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }, resultClass = User.class)
public class User implements java.io.Serializable {
private static final long serialVersionUID = 5325039036880950119L;
private String userid;
private String loginid;
private String passwd;
//省略若干代碼
}
請注意call addUser語句,存儲過程是直接調用,而調用函數則是在前面加?=.這可是我幾天幾夜不休得出的結果,拿出來與大家分享,希望有需要的朋友不要走我的彎路!
轉載
『伍』 JPA怎麼調用ORACLE的存儲過程
雖然在資料庫的控制台上運行SQL和調用存儲過程的方法是一樣的,但是某些JDBC驅動程序里是運行SQL和調用存儲過程的實現方法是不一樣的,所以如果要調用存儲過程的話還是用CallableStatement比較好。
『陸』 JPA執行存儲過程需要在步驟上註明@Transactional嗎
一般的增刪改都要用@Transactional,只要你的方法里有這三類的操作就要加上這個註解,對於查就無所謂了
簡單的理解就是需要修改資料庫的操作你就加這個註解好了
『柒』 java,怎麼根據實體類和註解生成基礎的增刪改查的存儲過程
使用Mybatis,這個是最簡單的,配置完畢後直接在你的方法上面加Query註解
這個更簡單,使用Jpa,一個叫JpaRepository的類你可以關注一下,繼承了這個類以
後甚至不用寫方法和實現類,空著就行,這個類裡面封裝好了基本的crud,而如果想復雜
點可以參考一下這個類的文檔,方法名根據他們的規范來寫,同樣不需要實現類,再復雜
點的就直接加上Query註解就行啦
『捌』 使用JPA里怎麼配置使運行時輸出SQL語句
MyBatis詳解與配置MyBatis+Spring+MySqlMyBatis是一個可以自定義SQL、存儲過程和高級映射的持久層框架。MyBatis摒除了大部分的JDBC代碼、手工設置參數和結果集重獲。MyBatis只使用簡單的XML和註解來配置和映射基本數據類型、Map介面和POJO到資料庫記錄。相對Hibernate和ApacheOJB等「一站式」ORM解決方案而言,Mybatis是一種「半自動化」的ORM實現。需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(與Spring結合包)。MyBatis簡介MyBatis是一個可以自定義SQL、存儲過程和高級映射的持久層框架。MyBatis摒除了大部分的JDBC代碼、手工設置參數和結果集重獲。MyBatis只使用簡單的XML和註解來配置和映射基本數據類型、Map介面和POJO到資料庫記錄。相對Hibernate和ApacheOJB等「一站式」ORM解決方案而言,Mybatis是一種「半自動化」的ORM實現。需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(與Spring結合包)。
『玖』 jpa調用mysql有多返回值存儲過程詳解
jpa調用mysql有多返回值存儲過程詳解
@Entity
@Table(name = "USER", schema = "MOBILE", uniqueConstraints = {
@UniqueConstraint(columnNames = { "LOGINID" }),
@UniqueConstraint(columnNames = { "USERACCOUNT" }) })
@NamedNativeQuery(name = "addUser", query = "{call addUser(:pPortalID,:ploginid,:ploginpasswd,:pSelfQuiz,:pSelfAnswer,:pUserEmail,:pUserAccount,:pUserPin)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }, resultClass = User.class)
public class User implements java.io.Serializable {
private static final long serialVersionUID = 5325039036880950119L;
private String userid;
private String loginid;
private String passwd;
//省略若干代碼
}