下面列出了怎么用javax.persistence.StoredProcedureQuery的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void calculate() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
StoredProcedureQuery query = em.createNamedStoredProcedureQuery("calculate");
query.setParameter("x", 1.23d);
query.setParameter("y", 4d);
query.execute();
Double sum = (Double) query.getOutputParameterValue("sum");
log.info("Calculation result: 1.23 + 4 = " + sum);
em.getTransaction().commit();
em.close();
}
@Test
public void calculate() {
log.info("... calculate ...");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// define the stored procedure
StoredProcedureQuery query = em.createStoredProcedureQuery("calculate");
query.registerStoredProcedureParameter("x", Double.class, ParameterMode.IN);
query.registerStoredProcedureParameter("y", Double.class, ParameterMode.IN);
query.registerStoredProcedureParameter("sum", Double.class, ParameterMode.OUT);
// set input parameter
query.setParameter("x", 1.23d);
query.setParameter("y", 4d);
// call the stored procedure and get the result
query.execute();
Double sum = (Double) query.getOutputParameterValue("sum");
log.info("Calculation result: 1.23 + 4 = " + sum);
em.getTransaction().commit();
em.close();
}
@Test
public void testProcedureCallMultipleOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("getStatistics")
.registerStoredProcedureParameter(
"A", Long.class, ParameterMode.OUT)
.registerStoredProcedureParameter(
"B", Long.class, ParameterMode.OUT)
.registerStoredProcedureParameter(
"C", Long.class, ParameterMode.OUT);
query.execute();
Long a = (Long) query
.getOutputParameterValue("A");
Long b = (Long) query
.getOutputParameterValue("B");
Long c = (Long) query
.getOutputParameterValue("C");
});
}
@Test
public void testStoredProcedureRefCursor() {
try {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("post_comments");
query.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN);
query.registerStoredProcedureParameter(2, Class.class, ParameterMode.REF_CURSOR);
query.setParameter(1, 1L);
query.execute();
List<Object[]> postComments = query.getResultList();
assertNotNull(postComments);
});
} catch (Exception e) {
assertTrue(Pattern.compile("Dialect .*? not known to support REF_CURSOR parameters").matcher(e.getCause().getMessage()).matches());
}
}
@Test
public void testFunction() {
try {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("fn_count_comments");
query.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN);
query.setParameter("postId", 1L);
Long commentCount = (Long) query.getSingleResult();
assertEquals(Long.valueOf(2), commentCount);
});
} catch (Exception e) {
assertTrue(Pattern.compile("PROCEDURE high_performance_java_persistence.fn_count_comments does not exist").matcher(e.getCause().getCause().getMessage()).matches());
}
}
@Test
public void testStoredProcedureOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(
"postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter(
"commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query.getOutputParameterValue("commentCount");
assertEquals(Long.valueOf(2), commentCount);
});
}
@Test
public void testStoredProcedureRefCursor() {
try {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("post_comments")
.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN)
.registerStoredProcedureParameter(2, Class.class, ParameterMode.REF_CURSOR)
.setParameter(1, 1L);
query.execute();
List<Object[]> postComments = query.getResultList();
assertNotNull(postComments);
});
} catch (Exception e) {
assertTrue(Pattern.compile("Dialect .*? not known to support REF_CURSOR parameters").matcher(e.getCause().getMessage()).matches());
}
}
@Test
public void testStoredProcedureOutParameter() {
doInJPA(entityManager -> {
try {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter("commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query.getOutputParameterValue("commentCount");
assertEquals(Long.valueOf(2), commentCount);
ProcedureOutputs procedureOutputs = query.unwrap(ProcedureOutputs.class);
CallableStatement callableStatement = ReflectionUtils.getFieldValue(procedureOutputs, "callableStatement");
assertFalse(callableStatement.isClosed());
procedureOutputs.release();
assertTrue(callableStatement.isClosed());
} catch (SQLException e) {
fail(e.getMessage());
}
});
}
@Test
public void testStoredProcedureOutParameterCloseStatement() {
doInJPA(entityManager -> {
try {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter("commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
try {
query.execute();
Long commentCount = (Long) query.getOutputParameterValue("commentCount");
assertEquals(Long.valueOf(2), commentCount);
} finally {
query.unwrap(ProcedureOutputs.class).release();
}
CallableStatement callableStatement = ReflectionUtils.getFieldValue(query.unwrap(ProcedureOutputs.class), "callableStatement");
assertTrue(callableStatement.isClosed());
} catch (SQLException e) {
fail(e.getMessage());
}
});
}
@Test
public void deferredStoredProcedureQueryWithIndexedParameters() {
EntityManagerFactory emf = mock(EntityManagerFactory.class);
EntityManager targetEm = mock(EntityManager.class);
StoredProcedureQuery query = mock(StoredProcedureQuery.class);
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createStoredProcedureQuery("x")).willReturn(query);
willReturn("y").given(query).getOutputParameterValue(0);
willReturn("z").given(query).getOutputParameterValue(2);
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
spq.registerStoredProcedureParameter(0, String.class, ParameterMode.OUT);
spq.registerStoredProcedureParameter(1, Number.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.INOUT);
spq.execute();
assertEquals("y", spq.getOutputParameterValue(0));
try {
spq.getOutputParameterValue(1);
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
}
assertEquals("z", spq.getOutputParameterValue(2));
verify(query).registerStoredProcedureParameter(0, String.class, ParameterMode.OUT);
verify(query).registerStoredProcedureParameter(1, Number.class, ParameterMode.IN);
verify(query).registerStoredProcedureParameter(2, Object.class, ParameterMode.INOUT);
verify(query).execute();
verify(targetEm).close();
verifyNoMoreInteractions(query);
verifyNoMoreInteractions(targetEm);
}
@Test
public void deferredStoredProcedureQueryWithNamedParameters() {
EntityManagerFactory emf = mock(EntityManagerFactory.class);
EntityManager targetEm = mock(EntityManager.class);
StoredProcedureQuery query = mock(StoredProcedureQuery.class);
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createStoredProcedureQuery("x")).willReturn(query);
willReturn("y").given(query).getOutputParameterValue("a");
willReturn("z").given(query).getOutputParameterValue("c");
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
spq.registerStoredProcedureParameter("a", String.class, ParameterMode.OUT);
spq.registerStoredProcedureParameter("b", Number.class, ParameterMode.IN);
spq.registerStoredProcedureParameter("c", Object.class, ParameterMode.INOUT);
spq.execute();
assertEquals("y", spq.getOutputParameterValue("a"));
try {
spq.getOutputParameterValue("b");
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
}
assertEquals("z", spq.getOutputParameterValue("c"));
verify(query).registerStoredProcedureParameter("a", String.class, ParameterMode.OUT);
verify(query).registerStoredProcedureParameter("b", Number.class, ParameterMode.IN);
verify(query).registerStoredProcedureParameter("c", Object.class, ParameterMode.INOUT);
verify(query).execute();
verify(targetEm).close();
verifyNoMoreInteractions(query);
verifyNoMoreInteractions(targetEm);
}
@Test
public void deferredStoredProcedureQueryWithIndexedParameters() {
EntityManagerFactory emf = mock(EntityManagerFactory.class);
EntityManager targetEm = mock(EntityManager.class);
StoredProcedureQuery query = mock(StoredProcedureQuery.class);
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createStoredProcedureQuery("x")).willReturn(query);
willReturn("y").given(query).getOutputParameterValue(0);
willReturn("z").given(query).getOutputParameterValue(2);
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
spq.registerStoredProcedureParameter(0, String.class, ParameterMode.OUT);
spq.registerStoredProcedureParameter(1, Number.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.INOUT);
spq.execute();
assertEquals("y", spq.getOutputParameterValue(0));
try {
spq.getOutputParameterValue(1);
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
}
assertEquals("z", spq.getOutputParameterValue(2));
verify(query).registerStoredProcedureParameter(0, String.class, ParameterMode.OUT);
verify(query).registerStoredProcedureParameter(1, Number.class, ParameterMode.IN);
verify(query).registerStoredProcedureParameter(2, Object.class, ParameterMode.INOUT);
verify(query).execute();
verify(targetEm).close();
verifyNoMoreInteractions(query);
verifyNoMoreInteractions(targetEm);
}
@Test
public void deferredStoredProcedureQueryWithNamedParameters() {
EntityManagerFactory emf = mock(EntityManagerFactory.class);
EntityManager targetEm = mock(EntityManager.class);
StoredProcedureQuery query = mock(StoredProcedureQuery.class);
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createStoredProcedureQuery("x")).willReturn(query);
willReturn("y").given(query).getOutputParameterValue("a");
willReturn("z").given(query).getOutputParameterValue("c");
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
spq.registerStoredProcedureParameter("a", String.class, ParameterMode.OUT);
spq.registerStoredProcedureParameter("b", Number.class, ParameterMode.IN);
spq.registerStoredProcedureParameter("c", Object.class, ParameterMode.INOUT);
spq.execute();
assertEquals("y", spq.getOutputParameterValue("a"));
try {
spq.getOutputParameterValue("b");
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
}
assertEquals("z", spq.getOutputParameterValue("c"));
verify(query).registerStoredProcedureParameter("a", String.class, ParameterMode.OUT);
verify(query).registerStoredProcedureParameter("b", Number.class, ParameterMode.IN);
verify(query).registerStoredProcedureParameter("c", Object.class, ParameterMode.INOUT);
verify(query).execute();
verify(targetEm).close();
verifyNoMoreInteractions(query);
verifyNoMoreInteractions(targetEm);
}
/***
* 执行存储过程
* @param stringQuery 查询对象
* @return Boolean 执行是否成功
*/
@Override
public Boolean executeStoredProcedure(StringQuery stringQuery){
StoredProcedureQuery query=this.em.createNamedStoredProcedureQuery (stringQuery.getQuery ());
this.setParameter (query,stringQuery.getParams ());
return query.execute ();
}
/***
*
* @param stringQuery stringQuery
* @return List<T> 结果集
*/
@Override
public List<T> executeResultList(StringQuery stringQuery) {
StoredProcedureQuery query=this.em.createNamedStoredProcedureQuery (stringQuery.getQuery ());
this.setParameter (query,stringQuery.getParams ());
query.execute ();
List list=query.getResultList ();
return list;
}
/***
* 设置参数
* @param storedProcedureQuery 存储
* @param namedParams 对象
*/
private void setParameter(StoredProcedureQuery storedProcedureQuery, NamedParams namedParams){
Map<String,Object> params=namedParams.getParameters ();
if(CollectionUtils.isEmpty (params)){
return;
}
for(Map.Entry<String,Object> entry: params.entrySet ()){
storedProcedureQuery.setParameter (entry.getKey (),entry.getValue ());
}
}
@Override
public StoredProcedureQuery createNamedStoredProcedureQuery(String name) {
checkBlocking();
try (EntityManagerResult emr = getEntityManager()) {
return emr.em.createNamedStoredProcedureQuery(name);
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName) {
checkBlocking();
try (EntityManagerResult emr = getEntityManager()) {
return emr.em.createStoredProcedureQuery(procedureName);
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses) {
checkBlocking();
try (EntityManagerResult emr = getEntityManager()) {
return emr.em.createStoredProcedureQuery(procedureName, resultClasses);
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings) {
checkBlocking();
try (EntityManagerResult emr = getEntityManager()) {
return emr.em.createStoredProcedureQuery(procedureName, resultSetMappings);
}
}
@Override
public StoredProcedureQuery createNamedStoredProcedureQuery(String name) {
checkOpen();
try {
final ProcedureCallMemento memento = getFactory().getNamedQueryRepository().getNamedProcedureCallMemento( name );
if ( memento == null ) {
throw new IllegalArgumentException( "No @NamedStoredProcedureQuery was found with that name : " + name );
}
return memento.makeProcedureCall( this );
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName) {
try {
return createStoredProcedureCall( procedureName );
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses) {
try {
return createStoredProcedureCall( procedureName, resultClasses );
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings) {
checkOpen();
try {
try {
return createStoredProcedureCall( procedureName, resultSetMappings );
}
catch (UnknownSqlResultSetMappingException unknownResultSetMapping) {
throw new IllegalArgumentException( unknownResultSetMapping.getMessage(), unknownResultSetMapping );
}
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Test
public void testStoredProcedureOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("count_comments");
query.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN);
query.registerStoredProcedureParameter("commentCount", Long.class, ParameterMode.OUT);
query.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query.getOutputParameterValue("commentCount");
assertEquals(Long.valueOf(2), commentCount);
});
}
@Test
public void testStoredProcedureReturnValue() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("post_comments");
query.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN);
query.setParameter(1, 1L);
List<Object[]> postComments = query.getResultList();
assertEquals(2, postComments.size());
});
}
@Test
public void testStoredProcedureOutParameterDefaultClose() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter("commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query.getOutputParameterValue("commentCount");
assertEquals(Long.valueOf(2), commentCount);
});
}
@Test
public void testStoredProcedureRefCursor() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("post_comments")
.registerStoredProcedureParameter(1, void.class, ParameterMode.REF_CURSOR)
.registerStoredProcedureParameter(2, Long.class, ParameterMode.IN)
.setParameter(2, 1L);
List<Object[]> postComments = query.getResultList();
assertEquals(2, postComments.size());
});
}
@Test
public void plainJpa21() {
StoredProcedureQuery proc = em.createStoredProcedureQuery("plus1inout");
proc.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);
proc.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT);
proc.setParameter(1, 1);
proc.execute();
assertThat(proc.getOutputParameterValue(2), is((Object) 2));
}
public void registerMarshaller() {
if ( registered ) {
return;
}
StoredProcedureQuery storedProcedureQuery = em.createStoredProcedureQuery( "RegisterMarshallersTask" );
storedProcedureQuery.execute();
registered = true;
}