/** * Registers entity. {@link #registerType(Class) Registers types} and table names. */ public <E> DbEntityDescriptor<E> registerEntity(final Class<E> type) { DbEntityDescriptor<E> ded = registerType(type); DbEntityDescriptor existing = tableNamesMap.put(ded.getTableName(), ded); if (existing != null) { if (ded.getType() == type) { return ded; } throw new DbOomException("Entity registration failed! Table '" + ded.getTableName() + "' already mapped to an entity: " + existing.getType()); } return ded; }
/** * Returns property name for specified column name. */ public String getPropertyName(final String columnName) { DbEntityColumnDescriptor dec = findByColumnName(columnName); return dec == null ? null : dec.propertyName; }
DbEntityColumnDescriptor[] decList = ded.getColumnDescriptors(); String typeName = StringUtil.uncapitalize(ded.getEntityName());
/** * Removes entity and returns removed descriptor. */ public <E> DbEntityDescriptor<E> removeEntity(final Class<E> type) { DbEntityDescriptor<E> ded = descriptorsMap.remove(type); if (ded == null) { ded = createDbEntityDescriptor(type); } entityNamesMap.remove(ded.getEntityName()); tableNamesMap.remove(ded.getTableName()); return ded; }
/** * Registers just type and entity names. Enough for most usages. */ public <E> DbEntityDescriptor<E> registerType(final Class<E> type) { DbEntityDescriptor<E> ded = createDbEntityDescriptor(type); DbEntityDescriptor<E> existing = descriptorsMap.put(type, ded); if (log.isDebugEnabled()) { log.debug("Register " + type.getName() + " as " + ded.getTableName()); } if (existing != null) { if (ded.getType() == type) { return ded; } throw new DbOomException("Type already registered: " + existing.getType()); } existing = entityNamesMap.put(ded.getEntityName(), ded); if (existing != null) { throw new DbOomException("Name '" + ded.getEntityName() + "' already mapped to an entity: " + existing.getType()); } return ded; }
/** * Creates SELECT criteria for the entity matched by foreign key. * Foreign key is created by concatenating foreign table name and column name. */ public DbSqlBuilder findForeign(final Class entity, final Object value) { final String tableRef = createTableRefName(entity); final DbEntityDescriptor dedFk = entityManager.lookupType(value.getClass()); final String tableName = dbOomConfig.getTableNames().convertTableNameToEntityName(dedFk.getTableName()); final String columnName = dbOomConfig.getColumnNames().convertColumnNameToPropertyName(dedFk.getIdColumnName()); final String fkColumn = uncapitalize(tableName) + capitalize(columnName); final Object idValue = BeanUtil.pojo.getProperty(value, dedFk.getIdPropertyName()); return sql().$(SELECT).column(tableRef).$(FROM).table(entity, tableRef).$(WHERE).ref(tableRef, fkColumn).$(EQUALS).columnValue(idValue); }
/** * Resolves column db sql type and populates it in column descriptor if missing. */ protected void resolveColumnDbSqlType(final Connection connection, final DbEntityColumnDescriptor dec) { if (dec.dbSqlType != SqlType.DB_SQLTYPE_UNKNOWN) { return; } ResultSet rs = null; DbEntityDescriptor ded = dec.getDbEntityDescriptor(); try { DatabaseMetaData dmd = connection.getMetaData(); rs = dmd.getColumns(null, ded.getSchemaName(), ded.getTableName(), dec.getColumnName()); if (rs.next()) { dec.dbSqlType = rs.getInt("DATA_TYPE"); } else { dec.dbSqlType = SqlType.DB_SQLTYPE_NOT_AVAILABLE; if (log.isWarnEnabled()) { log.warn("Column SQL type not available: " + ded.toString() + '.' + dec.getColumnName()); } } } catch (SQLException sex) { dec.dbSqlType = SqlType.DB_SQLTYPE_NOT_AVAILABLE; if (log.isWarnEnabled()) { log.warn("Column SQL type not resolved: " + ded.toString() + '.' + dec.getColumnName(), sex); } } finally { DbUtil.close(rs); } }
/** * Creates table names for given types. */ protected String[] createTypesTableNames(final Class[] types) { String[] names = new String[types.length]; for (int i = 0; i < types.length; i++) { if (types[i] == null) { names[i] = null; continue; } DbEntityDescriptor ded = dbEntityManager.lookupType(types[i]); if (ded != null) { String tableName = ded.getTableName(); tableName = tableName.toUpperCase(); names[i] = tableName; } } return names; }
/** * Appends alias. */ protected void appendAlias(final StringBuilder query, final DbEntityDescriptor ded, final DbEntityColumnDescriptor dec) { final ColumnAliasType columnAliasType = templateData.getColumnAliasType(); if (columnAliasType == null || columnAliasType == ColumnAliasType.TABLE_REFERENCE) { final String tableName = ded.getTableName(); final String columnName = dec.getColumnNameForQuery(); templateData.registerColumnDataForTableRef(tableRef, tableName); query.append(tableRef).append(columnAliasSeparator).append(columnName); } else if (columnAliasType == ColumnAliasType.COLUMN_CODE) { final String tableName = ded.getTableName(); final String columnName = dec.getColumnName(); final String code = templateData.registerColumnDataForColumnCode(tableName, columnName); query.append(code); } else if (columnAliasType == ColumnAliasType.TABLE_NAME) { final String tableName = ded.getTableNameForQuery(); final String columnName = dec.getColumnNameForQuery(); query.append(tableName).append(columnAliasSeparator).append(columnName); } }
barbar.barId = Long.valueOf(2); String keyFoo = fooded.getKeyValue(foo); String keyBar = barded.getKeyValue(bar); String keyBarBar = barded.getKeyValue(barbar); assertFalse(keyBarBar.equals(keyBar)); assertEquals("idid", userded.getIdColumnName()); assertEquals(User.class.getName() + ":null", userded.getKeyValue(new User())); user2.getColumnDescriptors(); fail("error");
@Override public void process(StringBuilder out) { DbEntityDescriptor ded = entityName != null ? lookupName(entityName) : lookupType(entityType); StringBuilder col = new StringBuilder(); StringBuilder val = new StringBuilder(); DbEntityColumnDescriptor[] decList = ded.getColumnDescriptors(); String typeName = StringUtil.uncapitalize(ded.getEntityName()); int size = 0; for (DbEntityColumnDescriptor dec : decList) { String property = dec.getPropertyName(); Object value = BeanUtil.getDeclaredProperty(data, property); if (value == null) { continue; } if (size > 0) { col.append(',').append(' '); val.append(',').append(' '); } size++; col.append(dec.getColumnName()); String propertyName = typeName + '.' + property; defineParameter(val, propertyName, value, dec); } out.append("insert into ").append(ded.getTableName()).append(" (") .append(col).append(") values (").append(val).append(')'); }
@Override public void process(final StringBuilder out) { DbEntityDescriptor ded = entityName != null ? lookupName(entityName) : lookupType(entityType); StringBuilder col = new StringBuilder(); StringBuilder val = new StringBuilder(); DbEntityColumnDescriptor[] decList = ded.getColumnDescriptors(); String typeName = StringUtil.uncapitalize(ded.getEntityName()); int size = 0; for (DbEntityColumnDescriptor dec : decList) { if (dec.isId() && !defaultIsUpdateablePrimaryKey) { continue; } String property = dec.getPropertyName(); Object value = BeanUtil.declared.getProperty(data, property); if (value == null) { continue; } if (size > 0) { col.append(',').append(' '); val.append(',').append(' '); } size++; col.append(dec.getColumnNameForQuery()); final String propertyName = typeName + '.' + property; defineParameter(val, propertyName, value, dec); } out.append("insert into ").append(ded.getTableNameForQuery()).append(" (") .append(col).append(") values (").append(val).append(')'); }
assertEquals("TESTER", ded.getTableName()); assertNotNull(dbEntityManager.lookupTableName("TesTer")); assertNotNull(ded.findByColumnName("ID")); assertNotNull(ded.findByColumnName("id")); assertNotNull(ded.findByColumnName("Id")); assertNotNull(ded.findByColumnName("iD")); assertEquals("tester", ded.getTableName()); assertNotNull(dbEntityManager.lookupTableName("TesTer")); assertNotNull(ded.findByColumnName("ID")); assertNotNull(ded.findByColumnName("id")); assertNotNull(ded.findByColumnName("Id")); assertNotNull(ded.findByColumnName("iD")); assertEquals("Tester", ded.getTableName()); assertNotNull(dbEntityManager.lookupTableName("TesTer")); assertNotNull(ded.findByColumnName("ID")); assertNotNull(ded.findByColumnName("id")); assertNotNull(ded.findByColumnName("Id")); assertNotNull(ded.findByColumnName("iD"));
@Override public void process(final StringBuilder out) { final DbEntityDescriptor ded; if (tableRef != null) { ded = lookupTableRef(tableRef); final String tableName = resolveTable(tableRef, ded); out.append(tableName); } else { ded = findColumnRef(columnRef); } if (onlyId) { if (tableRef != null) { out.append('.'); } out.append(ded.getIdColumnName()); } else if (columnRef != null) { DbEntityColumnDescriptor dec = ded.findByPropertyName(columnRef); templateData.lastColumnDec = dec; if (dec == null) { throw new DbSqlBuilderException("Invalid column reference: [" + tableRef + '.' + columnRef + "]"); } if (tableRef != null) { out.append('.'); } out.append(dec.getColumnNameForQuery()); } }
DbEntityColumnDescriptor[] decList = ded.getColumnDescriptors(); int count = 0; boolean withIds = (columnRefArr != null) && ArraysUtil.contains(columnRefArr, StringPool.PLUS); final DbEntityColumnDescriptor dec = ded.findByPropertyName(columnRef); if (dec == null) { throw new DbSqlBuilderException("Invalid column reference: [" + tableRef + '.' + columnRef + "]");
/** * {@inheritDoc} */ @Override public Class[] resolveTables() { List<Class> classes = new ArrayList<>(tableNames.length); String lastTableName = null; resultColumns.clear(); for (int i = 0; i < tableNames.length; i++) { String tableName = tableNames[i]; String columnName = columnNames[i]; if (tableName == null) { // maybe JDBC driver does not support it throw new DbOomException(dbOomQuery, "Table name missing in meta-data"); } if ((!tableName.equals(lastTableName)) || (resultColumns.contains(columnName))) { resultColumns.clear(); lastTableName = tableName; DbEntityDescriptor ded = dbEntityManager.lookupTableName(tableName); if (ded == null) { throw new DbOomException(dbOomQuery, "Table name not registered: " + tableName); } classes.add(ded.getType()); } resultColumns.add(columnName); } return classes.toArray(new Class[0]); }
/** * Registers just type and entity names. Enough for most usages. */ public DbEntityDescriptor registerType(Class type) { DbEntityDescriptor ded = createDbEntityDescriptor(type); DbEntityDescriptor existing = descriptorsMap.put(type, ded); if (existing != null) { throw new DbOomException("Type registration failed! Type '" + existing.getType() + "' already registered."); } existing = entityNamesMap.put(ded.getEntityName(), ded); if (existing != null) { throw new DbOomException("Type registration failed! Name '" + ded.getEntityName() + "' already mapped to an entity class: " + existing.getType()); } return ded; }
/** * Returns column name for specified property name.. */ public String getColumnName(final String propertyName) { DbEntityColumnDescriptor dec = findByPropertyName(propertyName); return dec == null ? null : dec.columnName; }
/** * Returns the first property name of column marked as identity. * Throws an exception if table has composite primary key. */ public String getIdPropertyName() { ensureSingleIdColumn(); return idColumnDescriptors[0].getPropertyName(); }
/** * Returns ID value for given entity instance. */ public Object getIdValue(final E object) { final String propertyName = getIdPropertyName(); return BeanUtil.declared.getProperty(object, propertyName); }