Невозможно выбрать из таблицы, если таблица имеет нулевые значения, а объект имеет IdClass при весенней загрузке - PullRequest
0 голосов
/ 27 июня 2018

Скажем, у меня в БД есть таблица, в которой нет первичного ключа (и я не могу изменить ее по независящим от меня причинам).

Я определил объект для этой таблицы, и мой 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...