Скажем, у меня в БД есть таблица, в которой нет первичного ключа (и я не могу изменить ее по независящим от меня причинам).
Я определил объект для этой таблицы, и мой DAO выбирает из БД этот объект хорошо.
Затем я хотел добавить больше столбцов в качестве идентификатора для этой таблицы, поэтому я добавил @IdClass для этой сущности.
Я хотел выбрать строку со столбцом, который имеет нулевое значение в БД. DAO возвращает ноль! Если я удалил определение столбца из класса, снова выбор прошел хорошо.
Итак, в основном, у меня есть сущность и столбец в таблице, представленной этой сущностью, которая имеет нулевые значения в БД. Если я выберу через DAO:
- Если это просто сущность, выбор хорош.
- Если у него также есть @IdClass, выбор не подходит.
- Если у него есть @IdClass, а у нет столбца в определении, выбор хорош.
Также важно - я напечатал команду select через application.properties и запустил ее в своем MySQL. Несмотря на то, что он возвратил ноль в Java, он возвратил хорошие значения в MySQL.
Это сущность, и проблемный столбец (maxMarkets) находится в комментарии:
@Data
@Entity(name = "adapter_fix")
@IdClass(AdapterFix.class)
public class AdapterFix implements Serializable {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "SENDER_COMP_ID")
private String senderCompId;
@Column(name = "TARGET_COMP_ID")
private String targetCompId;
@Column(name = "START_TIME")
private Date startTime;
@Column(name = "END_TIME")
private Date endTime;
@Column(name = "START_DAY")
private Integer startDay;
@Column(name = "END_DAY")
private Integer endDay;
@Column(name = "TIMEZONE")
private String timezone;
@Column(name = "DATA_DICTIONARY")
private String dataDictionary;
@Column(name = "HEARTBEAT_INTERVAL")
private Integer heartbeatInterval;
@Column(name = "LOG_ON_TIMEOUT")
private Integer logOnTimeout;
@Column(name = "RECONNECT_INTERVAL")
private Integer reconnectInterval;
@Column(name = "LOG_OUT_TIMEOUT")
private Integer logOutTimeout;
@Column(name = "RESET_ON_LOGON")
private Integer resetOnLogon;
@Column(name = "RESET_ON_DISCONNECT")
private Integer resetOnDisconnect;
@Column(name = "REFRESH_ON_LOGON")
private Integer refreshOnLogon;
@Column(name = "RESET_ON_LOGOUT")
private Integer resetOnLogout;
@Column(name = "ACC_NAME")
private String accName;
@Column(name = "SESSION_TYPE")
private String sessionType;
@Column(name = "USER")
private String user;
@Column(name = "PASSWORD")
private String password;
@Column(name = "IP_ADDRESS")
private String ipAddress;
@Column(name = "PORT")
private Integer port;
@Column(name = "ENCRYPTION_TYPE")
private String encryptionType;
@Column(name = "MARKET_DEPT")
private Integer marketDept;
/*@Column(name = "MAX_MARKETS")
private Integer maxMarkets;*/
@Column(name = "STREAM_TYPES_ID")
private Long streamTypesId;
}
и DAO:
@EntityScan("com.tradair.test.entities.localhost.branches.tr_dev")
public interface AdapterFixRepositoryLocalhost extends CrudRepository<AdapterFix, Long> {
AdapterFix findById(@Param("id") Long ID);
}
Я хочу выбрать из нескольких баз данных, так что это мой конфиг для конкретной БД:
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "localhostTrDevEntityManagerFactory",
transactionManagerRef = "localhostTrDevTransactionManager",
basePackages = {"com.tradair.test.dao.localhost.tr_dev"}
)
public class LocalhostJpaConfigTRDev {
@Bean
@ConfigurationProperties("localhost.tr_dev")
public DataSourceProperties localhostTrDevDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "localhostTrDevDataSource")
@ConfigurationProperties(prefix = "localhost.tr_dev")
public DataSource configurelocalhostTrDevDataSource() {
return localhostTrDevDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "localhostTrDevEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(configurelocalhostTrDevDataSource());
entityManagerFactoryBean.setPackagesToScan("com.tradair.test.entities.localhost.branches.tr_dev");
entityManagerFactoryBean.setPersistenceUnitName("localhostTrDevPersistenceUnit");
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return entityManagerFactoryBean;
}
@Bean(name = "localhostTrDevTransactionManager")
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
Как я могу выбрать хорошие значения И иметь проблемный столбец?
РЕДАКТИРОВАТЬ: Приведенный выше код не является моей полной работой - это (обратите внимание, я хочу, чтобы каждый столбец был моим внешним ключом, потому что таблица не указала его):
Сущность:
@Data
@Entity(name = "adapter_fix")
@IdClass(AdapterFixPK.class)
public class AdapterFix extends AdapterFixPK implements Serializable {
@Column(name = "ID")
private Long id;
@Column(name = "SENDER_COMP_ID")
private String senderCompId;
@Column(name = "TARGET_COMP_ID")
private String targetCompId;
@Column(name = "START_TIME")
private Date startTime;
@Column(name = "END_TIME")
private Date endTime;
@Column(name = "START_DAY")
private Integer startDay;
@Column(name = "END_DAY")
private Integer endDay;
@Column(name = "TIMEZONE")
private String timezone;
@Column(name = "DATA_DICTIONARY")
private String dataDictionary;
@Column(name = "HEARTBEAT_INTERVAL")
private Integer heartbeatInterval;
@Column(name = "LOG_ON_TIMEOUT")
private Integer logOnTimeout;
@Column(name = "RECONNECT_INTERVAL")
private Integer reconnectInterval;
@Column(name = "LOG_OUT_TIMEOUT")
private Integer logOutTimeout;
@Column(name = "RESET_ON_LOGON")
private Integer resetOnLogon;
@Column(name = "RESET_ON_DISCONNECT")
private Integer resetOnDisconnect;
@Column(name = "REFRESH_ON_LOGON")
private Integer refreshOnLogon;
@Column(name = "RESET_ON_LOGOUT")
private Integer resetOnLogout;
@Column(name = "ACC_NAME")
private String accName;
@Column(name = "SESSION_TYPE")
private String sessionType;
@Column(name = "USER")
private String user;
@Column(name = "PASSWORD")
private String password;
@Column(name = "IP_ADDRESS")
private String ipAddress;
@Column(name = "PORT")
private Integer port;
@Column(name = "ENCRYPTION_TYPE")
private String encryptionType;
@Column(name = "MARKET_DEPT")
private Integer marketDept;
@Column(name = "MAX_MARKETS")
private Integer maxMarkets;
@Column(name = "STREAM_TYPES_ID")
private Long streamTypesId;
}
И ПК:
@Data
@MappedSuperclass
public class AdapterFixPK implements Serializable {
@Id
@Column(name = "ID")
private Long id;
@Id
@Column(name = "SENDER_COMP_ID")
private String senderCompId;
@Id
@Column(name = "TARGET_COMP_ID")
private String targetCompId;
@Id
@Column(name = "START_TIME")
private Date startTime;
@Id
@Column(name = "END_TIME")
private Date endTime;
@Id
@Column(name = "START_DAY")
private Integer startDay;
@Id
@Column(name = "END_DAY")
private Integer endDay;
@Id
@Column(name = "TIMEZONE")
private String timezone;
@Id
@Column(name = "DATA_DICTIONARY")
private String dataDictionary;
@Id
@Column(name = "HEARTBEAT_INTERVAL")
private Integer heartbeatInterval;
@Id
@Column(name = "LOG_ON_TIMEOUT")
private Integer logOnTimeout;
@Id
@Column(name = "RECONNECT_INTERVAL")
private Integer reconnectInterval;
@Id
@Column(name = "LOG_OUT_TIMEOUT")
private Integer logOutTimeout;
@Id
@Column(name = "RESET_ON_LOGON")
private Integer resetOnLogon;
@Id
@Column(name = "RESET_ON_DISCONNECT")
private Integer resetOnDisconnect;
@Id
@Column(name = "REFRESH_ON_LOGON")
private Integer refreshOnLogon;
@Id
@Column(name = "RESET_ON_LOGOUT")
private Integer resetOnLogout;
@Id
@Column(name = "ACC_NAME")
private String accName;
@Id
@Column(name = "SESSION_TYPE")
private String sessionType;
@Id
@Column(name = "USER")
private String user;
@Id
@Column(name = "PASSWORD")
private String password;
@Id
@Column(name = "IP_ADDRESS")
private String ipAddress;
@Id
@Column(name = "PORT")
private Integer port;
@Id
@Column(name = "ENCRYPTION_TYPE")
private String encryptionType;
@Id
@Column(name = "MARKET_DEPT")
private Integer marketDept;
@Id
@Column(name = "MAX_MARKETS")
private Integer maxMarkets;
@Id
@Column(name = "STREAM_TYPES_ID")
private Long streamTypesId;
}