java sql 联表查询系统_根据日期条件查询多表级联查询总结(java.util的Calendar类,本地Sql查询)...

背景:Comp项目要实现日期条件查询多表级联的数据信息,查询结果可多表多字段拼接,做以下总结:

1.Comp封装了比较方便的时间工具类DateUtil,如获取当天的最后时间23:59:59,获取当月的最后一天等,该工具类主要基于java.util的Calendar类实现的。

Calendar类是一个抽象类,没有构造方法,无法通过new来创建对象,提供了getInstance()方法来获取Calendar的实例。

public static Calendar getInstance(){

return createCalendar(TimeZone.getDefault(),

Locale.getDefault(Locale.Category.FORMAT));

}

调用getInstance()方法返回的是Calendar的一个子类对象,因为每个国家地区都有自己的一套日历算法,抽象类向外界提供一个通用的获取Calendar的方法。

Calendar类中我们主要关注set和add方法,set可以设置日历的时间如set(int,int,int)设置年月日,set(int,int,int,int,int,int)设置年月日时分秒,add方法可以关注add(int field, int amount),field表示要设置的域,在Calendar类中有定义,如1是年,2是月,5是日,具体参见Calendar类,amount表示变更的数量,当amount为负数的时候表示减小。

下面以获取当月最后一天的函数为例(参数为当前时间):

public static Date getLastDayOfMonth(Date date) {

// 获取Calendar实例

Calendar ca = Calendar.getInstance();

// 日历时间设置为当前时间 如2019-01-07 19:28:55

ca.setTime(date);

// 设置日期为当月1日 但有延缓计算的设置,所以当前不会立即计算,见下文

ca.set(5, 1);

// 月份加1 2019-02-01 19:28:55

ca.add(2, 1);

// 日减1 2019-01-31 19:28:55

ca.add(5, -1);

Date lastDate = ca.getTime();

return lastDate;

}

这里的field可以用Calendar.DATE代表5,Calendar.MONTH代表2,这样的代码可读性较强。

同时要主要set方法中的月份是从0开始的,即ca.set(2000, 0, 31, 0, 0 , 0);表示的是2000年1月31日

Calendar 对象在使用时,有一些值得注意的事项:

1. Calendar 的 set() 方法

set(int field, int value) - 是用来设置"年/月/日/小时/分钟/秒/微秒"等值

field 的定义在 Calendar 中

set(int year, int month, int day, int hour, int minute, int second) 但没有

set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不会自动将 MilliSecond 清为 0。

另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。

calendar.set(Calendar.MONTH, 7);

另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:

Calendar cal1 = Calendar.getInstance();

cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31

cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1

cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30

System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录

本地SQL查询主要基于JPA的EntityManager

参考:https://www.jianshu.com/p/091360c47e6b

EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。

org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean类是EntityManagerFactoryBean的工厂,可以管理数据库中的数据存储,核心代码:

EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();

Query nativeQuery = em.createNativeQuery(sql, T.class);

comp对repository层进行了封装,实现更加方便的分页查询,参数查询等,主要配置如下:

@Repository(value = "wssbfsbNwNativeSqlRepository")

public class WssbfsbNwNativeSqlRepository extends AbstractNativeSqlRepository{

@PersistenceContext(unitName = "nw-db")

private EntityManager entityManager;

@Override

protected EntityManager getEntityManager() {

return entityManager;

}

}

class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

class="cn.com.servyou.framework.jpa.entity.DynamicPersistenceUnitPostProcessor">

使用的时候注入即可:

@Autowired

@Qualifier(value = "wssbfsbNwNativeSqlRepository")

private NativeSqlRepository wssbfsbNwNativeSqlRepository;

具体的解读留在下回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值