1 22 package org.jboss.ejb.plugins.cmp.jdbc; 23 24 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCEntityBridge; 25 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge; 26 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge; 27 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData; 28 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCReadAheadMetaData; 29 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCTypeMappingMetaData; 30 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCFunctionMappingMetaData; 31 import org.jboss.ejb.EntityEnterpriseContext; 32 import org.jboss.ejb.GenericEntityObjectFactory; 33 import org.jboss.deployment.DeploymentException; 34 35 import javax.ejb.FinderException ; 36 import java.util.Collection ; 37 import java.util.Collections ; 38 import java.util.List ; 39 import java.lang.reflect.Method ; 40 41 52 public final class JDBCFindByPrimaryKeyQuery extends JDBCAbstractQueryCommand 53 { 54 private JDBCStoreManager manager; 55 private boolean rowLocking; 56 57 public JDBCFindByPrimaryKeyQuery(JDBCStoreManager manager, JDBCQueryMetaData q) 58 throws DeploymentException 59 { 60 super(manager, q); 61 this.manager = manager; 62 rowLocking = manager.getMetaData().hasRowLocking(); 63 64 JDBCEntityBridge entity = (JDBCEntityBridge) manager.getEntityBridge(); 65 66 JDBCTypeMappingMetaData typeMapping = this.manager.getJDBCTypeFactory().getTypeMapping(); 67 AliasManager aliasManager = new AliasManager( 68 typeMapping.getAliasHeaderPrefix(), 69 typeMapping.getAliasHeaderSuffix(), 70 typeMapping.getAliasMaxLength() 71 ); 72 73 String alias = aliasManager.getAlias(entity.getEntityName()); 74 75 StringBuffer select = new StringBuffer (200); 76 SQLUtil.getColumnNamesClause(entity.getPrimaryKeyFields(), alias, select); 77 78 StringBuffer from = new StringBuffer (); 79 from.append(entity.getQualifiedTableName()) 80 .append(' ') 81 .append(alias); 82 83 JDBCReadAheadMetaData readAhead = q.getReadAhead(); 85 if(readAhead.isOnFind()) 86 { 87 setEagerLoadGroup(readAhead.getEagerLoadGroup()); 88 if(getEagerLoadMask() != null) 89 { 90 SQLUtil.appendColumnNamesClause(entity.getTableFields(), getEagerLoadMask(), alias, select); 91 92 List onFindCMRList = JDBCAbstractQueryCommand.getLeftJoinCMRNodes( 93 entity, entity.getQualifiedTableName(), readAhead.getLeftJoins(), null); 94 95 if(!onFindCMRList.isEmpty()) 96 { 97 setOnFindCMRList(onFindCMRList); 98 JDBCAbstractQueryCommand.leftJoinCMRNodes(alias, onFindCMRList, aliasManager, from); 99 JDBCAbstractQueryCommand.appendLeftJoinCMRColumnNames(onFindCMRList, aliasManager, select); 100 } 101 } 102 } 103 104 StringBuffer where = new StringBuffer (); 105 SQLUtil.getWhereClause(entity.getPrimaryKeyFields(), alias, where); 106 107 StringBuffer sql = new StringBuffer (300); 109 if(rowLocking && readAhead.isOnFind() && getEagerLoadMask() != null) 110 { 111 JDBCFunctionMappingMetaData rowLockingTemplate = typeMapping.getRowLockingTemplate(); 112 rowLockingTemplate.getFunctionSql( 113 new Object []{ 114 select, 115 from, 116 where.length() == 0 ? null : where, 117 null }, 119 sql 120 ); 121 } 122 else 123 { 124 sql.append(SQLUtil.SELECT) 125 .append(select) 126 .append(SQLUtil.FROM) 127 .append(from) 128 .append(SQLUtil.WHERE) 129 .append(where); 130 } 131 132 setSQL(sql.toString()); 133 setParameterList(QueryParameter.createPrimaryKeyParameters(0, entity)); 134 } 135 136 public Collection execute(Method finderMethod, Object [] args, EntityEnterpriseContext ctx, GenericEntityObjectFactory factory) 137 throws FinderException 138 { 139 if(manager.getReadAheadCache().getPreloadDataMap(args[0], false) != null) 141 { 142 Object pk = null; 144 JDBCFieldBridge[] pkFields = manager.getEntityBridge().getPrimaryKeyFields(); 145 for(int i = 0; i < pkFields.length; ++i) 146 { 147 JDBCAbstractCMPFieldBridge pkField = ((JDBCAbstractCMPFieldBridge)pkFields[i]); 148 Object fieldValue = pkField.getPrimaryKeyValue(args[0]); 149 pk = pkField.setPrimaryKeyValue(pk, fieldValue); 150 } 151 152 final Object ejbObject = factory.getEntityEJBObject(pk); 153 return Collections.singletonList(ejbObject); 154 } 155 return super.execute(finderMethod, args, ctx, factory); 156 } 157 } 158 | Popular Tags |