项目:HibernateTips
文件:TestStoredProcedureQuery.java
@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",ParameterMode.IN);
query.registerStoredProcedureParameter("sum",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 testHibernateProcedureCallRefCursor() {
doInJPA(entityManager -> {
Session session = entityManager.unwrap(Session.class);
ProcedureCall call = session
.createStoredProcedureCall("post_comments");
call.registerParameter(1,void.class,ParameterMode.REF_CURSOR);
call.registerParameter(2,Long.class,ParameterMode.IN).bindValue(1L);
Output output = call.getoutputs().getCurrent();
if (output.isResultSet()) {
List<Object[]> postComments = ((ResultSetoutput) output).getResultList();
assertEquals(2,postComments.size());
}
});
}
private AbstractParameterRegistrationImpl(
ProcedureCallImpl procedureCall,Integer position,String name,ParameterMode mode,Class<T> type,Type hibernateType) {
this.procedureCall = procedureCall;
this.position = position;
this.name = name;
this.mode = mode;
this.type = type;
if ( mode == ParameterMode.REF_CURSOR ) {
return;
}
setHibernateType( hibernateType );
}
@Override
@SuppressWarnings("unchecked")
public T extract(CallableStatement statement) {
if ( mode == ParameterMode.IN ) {
throw new ParameterMisuseException( "IN parameter not valid for output extraction" );
}
else if ( mode == ParameterMode.REF_CURSOR ) {
throw new ParameterMisuseException( "REF_CURSOR parameters should be accessed via results" );
}
try {
if ( ProcedureParameterExtractionAware.class.isinstance( hibernateType ) ) {
return (T) ( (ProcedureParameterExtractionAware) hibernateType ).extract( statement,startIndex,session() );
}
else {
return (T) statement.getobject( startIndex );
}
}
catch (sqlException e) {
throw procedureCall.getSession().getFactory().getsqlExceptionHelper().convert(
e,"Unable to extract OUT/INOUT parameter value"
);
}
}
项目:exmatrikulator
文件:BackupService.java
/**
* Creates a Backup of the Database in the directory specified in
* config.properties.
*
* @param name the name of the Backup.
*
* @return Backup entinty.
*
* @throws QueryTimeoutException if the query should fail.
* @throws PersistenceException if persisting should fail.
* @Throws IOException if config.properties is not readable.
*/
public Backup runBackup(String name) throws QueryTimeoutException,PersistenceException,IOException {
Properties props = ServerProperties.getProperties();
Date date = new Date();
String path = props.getProperty(dirPropertyKey)
+ name + "_" + getDateAsstring(date);
StoredProcedureQuery query = em.createStoredProcedureQuery(
"SYSCS_UTIL.SYSCS_BACKUP_DATABASE");
query.registerStoredProcedureParameter(1,String.class,ParameterMode.IN);
query.setParameter(1,path);
query.execute();
log.debug("Backup query executed!");
Backup backup = generateBackup(name,path,date,getDirectorySize(new File(path)));
return backup;
}
@Test
public void testHibernateProcedureCallMultipleOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("getStatistics")
.registerStoredProcedureParameter(
"A",ParameterMode.OUT)
.registerStoredProcedureParameter(
"B",ParameterMode.OUT)
.registerStoredProcedureParameter(
"C",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,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",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",ParameterMode.IN)
.registerStoredProcedureParameter(
"commentCount",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,ParameterMode.IN)
.registerStoredProcedureParameter(2,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());
}
}
项目:javaee7-developer-handbook
文件:StoredProcedureJPATest2.java
@Test
public void shouldInvokeStoredProcedureWithOutbound() throws Exception {
utx.begin();
StoredProcedureQuery query =
em.createStoredProcedureQuery("DOUBLE_SP")
.registerStoredProcedureParameter(
"P1",Float.class,ParameterMode.IN)
.registerStoredProcedureParameter(
"P2",ParameterMode.OUT)
.setParameter("P1",new Float(2.345));
boolean status = query.execute();
System.out.printf("****************** status=%s\n",status);
assertFalse( query.hasMoreResults());
Double p2 = ( Double)query.getoutputParameterValue("P2");
System.out.printf("The output P2 was %12.7f\n",p2 );
utx.commit();
}
项目:javaee7-developer-handbook
文件:CompoundInterestRateStoredProcJPATest.java
@Test
public void shouldInvokeStoredProcedureWithOutbound() throws Exception {
StoredProcedureQuery query =
em.createStoredProcedureQuery("COMPOUND_INTEREST_SP")
.registerStoredProcedureParameter(
"P",ParameterMode.IN)
.registerStoredProcedureParameter(
"r",ParameterMode.IN)
.registerStoredProcedureParameter(
"n",Integer.class,ParameterMode.IN)
.registerStoredProcedureParameter(
"t",ParameterMode.IN)
.registerStoredProcedureParameter(
"A",ParameterMode.OUT)
.setParameter("P",new Float(1500))
.setParameter("r",new Float(0.043))
.setParameter("n",new Integer(4))
.setParameter("t",new Integer(6));
// P = 1500,r = 0.043 (4.3%),n = 4,and t = 6:
boolean status = query.execute();
System.out.printf("****************** status=%s\n",status);
assertFalse( query.hasMoreResults());
Double A = ( Double)query.getoutputParameterValue("A");
System.out.printf("The output A was %12.7f\n",A );
assertEquals( 1938.84,A,0.005 );
}
项目:javaee7-developer-handbook
文件:StoredProcedureJPATest.java
@Test
public void shouldInvokeStoredProcedureWithResultSet() throws Exception {
utx.begin();
StoredProcedureQuery query =
em.createStoredProcedureQuery("READ_TAX_SP")
.registerStoredProcedureParameter(
"TAX_CODE_ID",ParameterMode.IN)
.setParameter("TAX_CODE_ID",101);
boolean status = query.execute();
System.out.printf("****************** status=%s\n",status);
List rs = query.getResultList();
assertNotNull(rs);
System.out.printf("****************** rs=%s\n",rs );
Object row[] = (Object[])rs.get(0);
System.out.printf("****************** row=%s\n",row );
for (int col=0; col<row.length; ++col ) {
System.out.printf("**** row[%d]=%s\n",col,row[col] );
}
utx.commit();
}
项目:spring-data-examples
文件:UserRepositoryIntegrationTests.java
@Test
public void plainJpa21() {
StoredProcedureQuery proc = em.createStoredProcedureQuery("plus1inout");
proc.registerStoredProcedureParameter(1,ParameterMode.IN);
proc.registerStoredProcedureParameter(2,ParameterMode.OUT);
proc.setParameter(1,1);
proc.execute();
assertthat(proc.getoutputParameterValue(2),is((Object) 2));
}
项目:lams
文件:PostgresCallableStatementSupport.java
@Override
public void registerParameters(
String procedureName,CallableStatement statement,ParameterStrategy parameterStrategy,List<ParameterRegistrationImplementor<?>> parameterRegistrations,SessionImplementor session) {
// prepare parameters
int i = 1;
try {
for ( ParameterRegistrationImplementor parameter : parameterRegistrations ) {
if ( parameter.getMode() == ParameterMode.REF_CURSOR ) {
statement.registerOutParameter( i,Types.OTHER );
i++;
}
else {
parameter.prepare( statement,i );
i += parameter.getsqlTypes().length;
}
}
}
catch (sqlException e) {
throw session.getFactory().getsqlExceptionHelper().convert(
e,"Error registering CallableStatement parameters",procedureName
);
}
}
项目:lams
文件:StandardCallableStatementSupport.java
@Override
public String renderCallableStatement(
String procedureName,SessionImplementor session) {
final StringBuilder buffer = new StringBuilder().append( "{call " )
.append( procedureName )
.append( "(" );
String sep = "";
for ( ParameterRegistrationImplementor parameter : parameterRegistrations ) {
if ( parameter == null ) {
throw new QueryException( "Parameter registrations had gaps" );
}
if ( parameter.getMode() == ParameterMode.REF_CURSOR ) {
verifyRefCursorSupport( session.getFactory().getDialect() );
buffer.append( sep ).append( "?" );
sep = ",";
}
else {
for ( int i = 0; i < parameter.getsqlTypes().length; i++ ) {
buffer.append( sep ).append( "?" );
sep = ",";
}
}
}
return buffer.append( ")}" ).toString();
}
项目:lams
文件:StandardCallableStatementSupport.java
@Override
public void registerParameters(
String procedureName,SessionImplementor session) {
// prepare parameters
int i = 1;
try {
for ( ParameterRegistrationImplementor parameter : parameterRegistrations ) {
parameter.prepare( statement,i );
if ( parameter.getMode() == ParameterMode.REF_CURSOR ) {
i++;
}
else {
i += parameter.getsqlTypes().length;
}
}
}
catch (sqlException e) {
throw session.getFactory().getsqlExceptionHelper().convert(
e,procedureName
);
}
}
项目:lams
文件:ProcedureCallImpl.java
@Override
@SuppressWarnings("unchecked")
public <T> ParameterRegistration<T> registerParameter(int position,ParameterMode mode) {
final PositionalParameterRegistration parameterRegistration =
new PositionalParameterRegistration( this,position,mode,type );
registerParameter( parameterRegistration );
return parameterRegistration;
}
项目:lams
文件:ProcedureCallImpl.java
@Override
@SuppressWarnings("unchecked")
public <T> ParameterRegistration<T> registerParameter(String name,ParameterMode mode) {
final NamedParameterRegistration parameterRegistration = new NamedParameterRegistration( this,name,type );
registerParameter( parameterRegistration );
return parameterRegistration;
}
项目:lams
文件:ProcedureCallImpl.java
/**
* Collects any parameter registrations which indicate a REF_CURSOR parameter type/mode.
*
* @return The collected REF_CURSOR type parameters.
*/
public ParameterRegistrationImplementor[] collectRefCursorParameters() {
final List<ParameterRegistrationImplementor> refCursorParams = new ArrayList<ParameterRegistrationImplementor>();
for ( ParameterRegistrationImplementor param : registeredParameters ) {
if ( param.getMode() == ParameterMode.REF_CURSOR ) {
refCursorParams.add( param );
}
}
return refCursorParams.toArray( new ParameterRegistrationImplementor[refCursorParams.size()] );
}
NamedParameterRegistration(
ProcedureCallImpl procedureCall,Class<T> type) {
super( procedureCall,type );
}
NamedParameterRegistration(
ProcedureCallImpl procedureCall,Type hibernateType) {
super( procedureCall,type,hibernateType );
}
protected AbstractParameterRegistrationImpl(
ProcedureCallImpl procedureCall,Class<T> type) {
this( procedureCall,null,type );
}
protected AbstractParameterRegistrationImpl(
ProcedureCallImpl procedureCall,Type hibernateType) {
this( procedureCall,hibernateType );
}
private AbstractParameterRegistrationImpl(
ProcedureCallImpl procedureCall,Class<T> type) {
this(
procedureCall,procedureCall.getSession().getFactory().getTypeResolver().heuristicType( type.getName() )
);
}
PositionalParameterRegistration(
ProcedureCallImpl procedureCall,type );
}
PositionalParameterRegistration(
ProcedureCallImpl procedureCall,hibernateType );
}
项目:actionbazaar
文件:BidManager.java
/**
* Saves a bid to the database
* @param bid - bid
*/
public void save(Bid bid) {
entityManager.persist(bid);
StoredProcedureQuery spq = entityManager.createStoredProcedureQuery("getQtyOrders");
spq.registerStoredProcedureParameter("param1",ParameterMode.IN);
spq.setParameter("param1",55);
Object[] count = (Object[])spq.getSingleResult();
logger.log(Level.INFO,"Single result: {0}",count[0]);
}
@Test
public void testStoredProcedureOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("count_comments");
query.registerStoredProcedureParameter("postId",ParameterMode.IN);
query.registerStoredProcedureParameter("commentCount",ParameterMode.OUT);
query.setParameter("postId",1L);
query.execute();
Long commentCount = (Long) query.getoutputParameterValue("commentCount");
assertEquals(Long.valueOf(2),commentCount);
});
}
@Test
public void testHibernateProcedureCallOutParameter() {
doInJPA(entityManager -> {
Session session = entityManager.unwrap(Session.class);
ProcedureCall call = session.createStoredProcedureCall("getStatistics");
call.registerParameter("postId",ParameterMode.IN).bindValue(1L);
call.registerParameter("commentCount",ParameterMode.OUT);
Long commentCount = (Long) call.getoutputs().getoutputParameterValue("commentCount");
assertEquals(Long.valueOf(2),commentCount);
});
}
@Test
public void testStoredProcedureReturnValue() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("post_comments");
query.registerStoredProcedureParameter(1,ParameterMode.IN);
query.setParameter(1,1L);
List<Object[]> postComments = query.getResultList();
assertEquals(2,postComments.size());
});
}
@Test
public void testStoredProcedureOutParameter() {
doInJPA(entityManager -> {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter("postId",ParameterMode.IN)
.registerStoredProcedureParameter("commentCount",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,ParameterMode.REF_CURSOR)
.registerStoredProcedureParameter(2,ParameterMode.IN)
.setParameter(2,postComments.size());
});
}
项目:lams
文件:PostgresCallableStatementSupport.java
@Override
public String renderCallableStatement(
String procedureName,SessionImplementor session) {
// if there are any parameters,see if the first is REF_CURSOR
final boolean firstParamIsRefCursor = ! parameterRegistrations.isEmpty()
&& parameterRegistrations.get( 0 ).getMode() == ParameterMode.REF_CURSOR;
if ( firstParamIsRefCursor ) {
// validate that the parameter strategy is positional (cannot mix,and REF_CURSOR is inherently positional)
if ( parameterStrategy == ParameterStrategy.NAMED ) {
throw new HibernateException( "Cannot mix named parameters and REF_CURSOR parameter on Postgresql" );
}
}
final StringBuilder buffer;
if ( firstParamIsRefCursor ) {
buffer = new StringBuilder().append( "{? = call " );
}
else {
buffer = new StringBuilder().append( "{call " );
}
buffer.append( procedureName ).append( "(" );
String sep = "";
// skip the first registration if it was a REF_CURSOR
final int startIndex = firstParamIsRefCursor ? 1 : 0;
for ( int i = startIndex; i < parameterRegistrations.size(); i++ ) {
final ParameterRegistrationImplementor parameter = parameterRegistrations.get( i );
// any additional REF_CURSOR parameter registrations are an error
if ( parameter.getMode() == ParameterMode.REF_CURSOR ) {
throw new HibernateException( "Postgresql supports only one REF_CURSOR parameter,but multiple were registered" );
}
for ( int ignored : parameter.getsqlTypes() ) {
buffer.append( sep ).append( "?" );
sep = ",";
}
}
return buffer.append( ")}" ).toString();
}
项目:lams
文件:ProcedureCallImpl.java
项目:lams
文件:ProcedureCallImpl.java
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。