–dataSource-- entitymanagerfactory–PlatformTransactionManager
–springboot jpa配置*
OrderRepository和VerifyRepository在同一个包下面,扫描的时候会把所有的orderRepository,verifyRepository类配置两个,扫描两次注入容器中的名称和类型又是一样的,所以会有冲突,只会有一个生效
并不知道PrimaryConfiguration和BackupConfiguration谁先配置
repository 扫描的时候并不确定那个先扫描,查看源代码,设断点看扫描顺序
解决办法:
将orderRepository,verifyRepository分开放在两个包里。
新建configuration包,并新建java类DataAccessConfiguration
具体如下:
package com.imooc.seller.configuration;
import com.imooc.entity.Order;
import com.imooc.entity.VerificationOrder;
import com.imooc.seller.repositories.OrderRepository;
import com.imooc.seller.repositoriesbackup.DifferentOrderRepository;
import com.imooc.seller.repositoriesbackup.VerifyRepository;
import org.aspectj.weaver.ast.Or;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
import org.springframework.boot.jdbc.SchemaManagement;
import org.springframework.boot.jdbc.SchemaManagementProvider;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
//import org.springframework.data.repository.config.RepositoryBeanNamePrefix;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 数据库相关操作配置
*/
@Configuration
public class DataAccessConfiguration {
@Autowired
private JpaProperties properties;
@Autowired
private ObjectProvider<List<SchemaManagementProvider>> providers;
@Autowired
private ObjectProvider<PhysicalNamingStrategy> physicalNamingStrategy;
@Autowired
private ObjectProvider<ImplicitNamingStrategy> implicitNamingStrategy;
//配置数据源 dataSource-- entitymanagerfactory--PlatformTransactionManager--springboot jpa配置
//主库数据源
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
public DataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
//备份库数据源
@Bean
@ConfigurationProperties("spring.datasource.backup")
public DataSourceProperties backupDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource backupDataSource() {
return backupDataSourceProperties().initializeDataSourceBuilder().build();
}
//主库LocalContainerEntityManagerFactoryBean
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder,@Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages(Order.class)
.properties(getVendorProperties(dataSource))
.persistenceUnit("primary")
.build();
}
//备库LocalContainerEntityManagerFactoryBean
@Bean
public LocalContainerEntityManagerFactoryBean backupEntityManagerFactory(
EntityManagerFactoryBuilder builder,@Qualifier("backupDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages(Order.class)
.properties(getVendorProperties(dataSource))
.persistenceUnit("backup")
.build();
}
//主库PlatformTransactionManager
@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager(primaryEntityManagerFactory.getObject());
return transactionManager;
}
//备库PlatformTransactionManager
@Bean
public PlatformTransactionManager backupTransactionManager(@Qualifier("backupEntityManagerFactory") LocalContainerEntityManagerFactoryBean backupEntityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager(backupEntityManagerFactory.getObject());
return transactionManager;
}
//OrderRepository和VerifyRepository在同一个包下面,扫描的时候会把所有的orderRepository,verifyRepository类配置两个,扫描两次注入容器中的名称和类型又是一样的,所以会有冲突,只会有一个生效
//并不知道PrimaryConfiguration和BackupConfiguration谁先配置
//repository 扫描的时候并不确定那个先扫描,查看源代码,设断点看扫描顺序
@EnableJpaRepositories(basePackageClasses = {OrderRepository.class},
entityManagerFactoryRef = "primaryEntityManagerFactory",transactionManagerRef = "primaryTransactionManager")
@Primary
public class PrimaryConfiguration {
}
@EnableJpaRepositories(basePackageClasses = {VerifyRepository.class,DifferentOrderRepository.class},
entityManagerFactoryRef = "backupEntityManagerFactory",transactionManagerRef = "backupTransactionManager")
public class BackupConfiguration {
}
protected Map<String, Object> getVendorProperties(DataSource dataSource) {
Map<String, Object> vendorProperties = new LinkedHashMap<String, Object>();
String defaultDdlMode = new HibernateDefaultDdlAutoProvider(
providers.getIfAvailable(Collections::emptyList))
.getDefaultDdlAuto(dataSource);
vendorProperties.putAll(properties.getHibernateProperties(
new HibernateSettings().ddlAuto(defaultDdlMode).physicalNamingStrategy(physicalNamingStrategy.getIfAvailable())
.implicitNamingStrategy(implicitNamingStrategy.getIfAvailable())
));
return vendorProperties;
}
class HibernateDefaultDdlAutoProvider implements SchemaManagementProvider {
private final List<SchemaManagementProvider> providers;
HibernateDefaultDdlAutoProvider(List<SchemaManagementProvider> providers) {
this.providers = providers;
}
public String getDefaultDdlAuto(DataSource dataSource) {
if (!EmbeddedDatabaseConnection.isEmbedded(dataSource)) {
return "none";
}
SchemaManagement schemaManagement = getSchemaManagement(dataSource);
if (SchemaManagement.MANAGED.equals(schemaManagement)) {
return "none";
}
return "create-drop";
}
@Override
public SchemaManagement getSchemaManagement(DataSource dataSource) {
for (SchemaManagementProvider provider : this.providers) {
SchemaManagement schemaManagement = provider.getSchemaManagement(dataSource);
if (SchemaManagement.MANAGED.equals(schemaManagement)) {
return schemaManagement;
}
}
return SchemaManagement.UNMANAGED;
}
}
}
按库分离
在jpa配置时实现按库分离
OrderRepository—主库
VerifyRepository,DifferentOrderRepository—备库
application.yml
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT
datasource:
primary:
url: jdbc:mysql:///seller?useUnicode=true&characterEncoding=utf-8
username: root
password: 915099
driverClassName: com.mysql.jdbc.Driver
backup:
url: jdbc:mysql:///seller-backup?useUnicode=true&characterEncoding=utf-8
username: root
password: 915099
driverClassName: com.mysql.jdbc.Driver
jpa:
database: mysql
show-sql: true
OrderRepository
package com.imooc.seller.repositories;
import com.imooc.entity.Order;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.Date;
import java.util.List;
/**
* 订单管理,继承接口
*/
public interface OrderRepository extends JpaRepository<Order, String> , JpaSpecificationExecutor<Order> {
@Query(value = "SELECT CONCAT_WS('|', order_id,outer_order_id,chan_id,chan_user_id,product_id,order_type,amount,DATE_FORMAT( create_at,'%Y-%m-%d %H:%i:%s')) FROM order_t WHERE order_status = 'success' AND chan_id = ?1 AND create_at >= ?2 AND create_at < ?3",nativeQuery = true)
List<String> queryVerificationOrders(String chanId, Date start, Date end);
}
VerifyRepository
package com.imooc.seller.repositoriesbackup;
import com.imooc.entity.VerificationOrder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.Date;
import java.util.List;
/**
* 对账相关
*/
public interface VerifyRepository extends JpaRepository<VerificationOrder, String>, JpaSpecificationExecutor<VerificationOrder> {
/**
* 查询某段时间[start,end)内的某个渠道chanId的对账数据
* @param chanId
* @param start
* @param end
* @return 对账数据列表
*/
// //生成对账文件的sql语句实现
// @Query(value = "SELECT CONCAT_WS('|', order_id,outer_order_id,chan_id,chan_user_id,product_id,order_type,amount,DATE_FORMAT( create_at,'%Y-%m-%d %H:%i:%s')) FROM order_t WHERE order_status = 'success' AND chan_id = ?1 AND create_at >= ?2 AND create_at < ?3",nativeQuery = true)
// List<String> queryVerificationOrders(String chanId, Date start,Date end);
// //长款 (left join 左连接,以t为准)左边有,右边没有
// @Query(value = "SELECT t.`order_id` FROM order_t t LEFT JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE v.`order_id` IS NULL AND v.create_at >= ?2 AND v.create_at < ?3",nativeQuery = true)
// List<String> queryExcessOrders(String chanId, Date start,Date end);
// //漏单 左边有,右边没有
// @Query(value = "SELECT v.`order_id` FROM verification_order v LEFT JOIN order_t t ON t.`chan_id` = ?1 AND v.`outer_order_id` = t.`order_id` WHERE t.`order_id` IS NULL AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
// List<String> queryMissOrders(String chanId, Date start,Date end);
// //不一致 ,CONCAT_WS(separator,str1,str2,...),以什么连接字段
// @Query(value = "SELECT t.order_id ,t.chan_id,t.product_id,t.chan_user_id,t.order_type,t.outer_order_id,t.amount,DATE_FORMAT( t.create_at,'%Y-%m-%d %H:%i:%s'))FROM order_t t JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE CONCAT_WS('|',t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT( t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|',v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT( v.create_at,'%Y-%m-%d %H:%i:%s')) AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
// List<String> queryDifferentOrders(String chanId, Date start,Date end);
@Query(value = "SELECT CONCAT_WS('|', order_id,outer_order_id,chan_id,chan_user_id,product_id,order_type,amount,DATE_FORMAT( create_at,'%Y-%m-%d %H:%i:%s')) FROM order_t WHERE order_status = 'success' AND chan_id = ?1 AND create_at >= ?2 AND create_at < ?3",nativeQuery = true)
List<String> queryVerificationOrders(String chanId, Date start, Date end);
@Query(value = "SELECT t.`order_id` FROM order_t t LEFT JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE v.`order_id` IS NULL AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
List<String> queryExcessOrders(String chanId, Date start, Date end);
@Query(value = "SELECT v.`order_id` FROM verification_order v LEFT JOIN order_t t ON t.`chan_id` = ?1 AND v.`outer_order_id` = t.`order_id` WHERE t.`order_id` IS NULL AND v.create_at >= ?2 AND v.create_at < ?3",nativeQuery = true)
List<String> queryMissOrders(String chanId, Date start, Date end);
//
// @Query(value = "SELECT t.`order_id` ,t.`chan_id`,t.`product_id`,t.`chan_user_id`,t.`outer_order_id`,t.`amount`,DATE_FORMAT( t.`create_at`,'%Y-%m-%d %H:%i:%s'))FROM order_t t JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE CONCAT_WS('|',t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT( t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|',v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT( v.create_at,'%Y-%m-%d %H:%i:%s')) AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
//先用'|'连接起来,之后才好分割
// @Query(value = "SELECT CONCAT_WS('|',t.order_id,t.chan_id,t.product_id,t.chan_user_id,t.order_type,t.outer_order_id,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s')) FROM order_t t JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE CONCAT_WS('|',t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT( t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|',v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT( v.create_at,'%Y-%m-%d %H:%i:%s')) AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
// //@Query(value = "SELECT t.order_id,t.chan_id,t.chan_user_id,t.product_id,t.outer_order_id,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s') FROM order_t t JOIN verification_order v on t.chan_id = ?1 AND t.outer_order_id = v.order_id WHERE CONCAT_WS('|', t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|', v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT(v.create_at,'%Y-%m-%d %H:%i:%s')) AND create_at >= ?2 AND create_at <= ?3;\n",nativeQuery = true)
// List<String> queryDifferentOrders(String chanId, Date start, Date end);
//多库多表查询
@Query(value = "SELECT CONCAT_WS('|',t.order_id,t.chan_id,t.product_id,t.chan_user_id,t.order_type,t.outer_order_id,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s')) FROM order_t t JOIN verification_order v ON t.`chan_id` = ?1 AND t.`outer_order_id` = v.`order_id` WHERE CONCAT_WS('|',t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT( t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|',v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT( v.create_at,'%Y-%m-%d %H:%i:%s')) AND t.create_at >= ?2 AND t.create_at < ?3",nativeQuery = true)
//@Query(value = "SELECT t.order_id,t.chan_id,t.chan_user_id,t.product_id,t.outer_order_id,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s') FROM order_t t JOIN verification_order v on t.chan_id = ?1 AND t.outer_order_id = v.order_id WHERE CONCAT_WS('|', t.chan_id,t.chan_user_id,t.product_id,t.order_type,t.amount,DATE_FORMAT(t.create_at,'%Y-%m-%d %H:%i:%s')) != CONCAT_WS('|', v.chan_id,v.chan_user_id,v.product_id,v.order_type,v.amount,DATE_FORMAT(v.create_at,'%Y-%m-%d %H:%i:%s')) AND create_at >= ?2 AND create_at <= ?3;\n",nativeQuery = true)
List<String> queryDifferentOrders(String chanId, Date start, Date end);
}
entity类
order
package com.imooc.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单
*/
@Entity(name = "order_t")
public class Order implements Serializable {
@Id
private String orderId;
//渠道id
private String chanId;
private String chanUserId;
/**
* @see com.imooc.entity.enums.OrderType
*/
private String orderType;
private String productId;
private BigDecimal amount;
private String outerOrderId;
/**
* @see com.imooc.entity.enums.OrderStatus
*/
private String orderStatus;
private String memo;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date createAt;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date updateAt;
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getChanUserId() {
return chanUserId;
}
public void setChanUserId(String chanUserId) {
this.chanUserId = chanUserId;
}
public String getOrderType() {
return orderType;
}
public void setOrderType(String orderType) {
this.orderType = orderType;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public String getOuterOrderId() {
return outerOrderId;
}
public void setOuterOrderId(String outerOrderId) {
this.outerOrderId = outerOrderId;
}
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this.createAt = createAt;
}
public Date getUpdateAt() {
return updateAt;
}
public void setUpdateAt(Date updateAt) {
this.updateAt = updateAt;
}
}
VerificationOrder
package com.imooc.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单
*/
@Entity(name = "verification_order")
public class VerificationOrder implements Serializable {
@Id
private String orderId;
//渠道id
private String chanId;
private String chanUserId;
/**
* @see com.imooc.entity.enums.OrderType
*/
private String orderType;
private String productId;
private BigDecimal amount;
private String outerOrderId;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date createAt;
@Override
public String toString() {
return "VerificationOrder{" +
"orderId='" + orderId + '\'' +
", chanId='" + chanId + '\'' +
", chanUserId='" + chanUserId + '\'' +
", orderType='" + orderType + '\'' +
", productId='" + productId + '\'' +
", amount=" + amount +
", outerOrderId='" + outerOrderId + '\'' +
", createAt=" + createAt +
'}';
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getChanUserId() {
return chanUserId;
}
public void setChanUserId(String chanUserId) {
this.chanUserId = chanUserId;
}
public String getOrderType() {
return orderType;
}
public void setOrderType(String orderType) {
this.orderType = orderType;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public String getOuterOrderId() {
return outerOrderId;
}
public void setOuterOrderId(String outerOrderId) {
this.outerOrderId = outerOrderId;
}
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this.createAt = createAt;
}
}
测试类
package com.imooc.seller;
import com.imooc.entity.DifferentOrder;
import com.imooc.seller.repositories.OrderRepository;
import com.imooc.seller.repositoriesbackup.DifferentOrderRepository;
import com.imooc.seller.repositoriesbackup.VerifyRepository;
import com.imooc.seller.service.VerifyService;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 对账测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class VerifyTest {
@Autowired
private OrderRepository orderRepository;
@Autowired
private VerifyRepository verifyRepository;
@Test
public void queryOrder(){
// 月份减一, 2018.12.31 ---2018.11.31
Date day = new GregorianCalendar(2018,11,31).getTime();
Date start = getStartOfDay(day);
Date end = add24Hours(start);
System.out.println(orderRepository.queryVerificationOrders("10001", start, end));
System.out.println(verifyRepository.queryVerificationOrders("10001", start, end));
}
private Date add24Hours(Date start) {
return new Date(start.getTime() + 1000 * 60 *60 *24);
}
private static DateFormat DAY_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
private Date getStartOfDay(Date day) {
String start_str = DAY_FORMAT.format(day);
Date start = null;
try {
start = DAY_FORMAT.parse(start_str);
} catch (ParseException e) {
e.printStackTrace();
}
return start;
}
}
数据库文件:
结果:
Hibernate: SELECT CONCAT_WS(’|’, order_id,outer_order_id,chan_id,chan_user_id,product_id,order_type,amount,DATE_FORMAT( create_at,’%Y-%m-%d %H:%i:%s’)) FROM order_t WHERE order_status = ‘success’ AND chan_id = ? AND create_at >= ? AND create_at < ?
[14ef49d1d3f04851bdb6d0ca62f96790|000003|10001|001|002|APPLY|100.000|2018-12-31 01:15:48, 169c5ac94c594e2b834a30db2bbd4f3d|000004|10001|002|002|APPLY|100.000|2018-12-31 23:15:48]
Hibernate: SELECT CONCAT_WS(’|’, order_id,outer_order_id,chan_id,chan_user_id,product_id,order_type,amount,DATE_FORMAT( create_at,’%Y-%m-%d %H:%i:%s’)) FROM order_t WHERE order_status = ‘success’ AND chan_id = ? AND create_at >= ? AND create_at < ?
[0000088|000003|10001|001|002|APPLY|100.000|2018-12-31 01:15:48, 0000099|000004|10001|002|002|APPLY|100.000|2018-12-31 23:15:48]
有兴趣可以试一下,哈哈哈。