❓问题:对于一个实体,我想要实现这一个实体进行多个相同的表进行查询,此时在网上搜索,发现如下解决问题方法
1.给定实体类加入@Table和@SecondaryTable注解,类似如下:
@Entity
@Table(name = "device1")
@SecondaryTables({
@SecondaryTable(name = "device2"),
@SecondaryTable(name = "device3"),
@SecondaryTable(name = "device4"),
@SecondaryTable(name = "device5")
})
public class Device {
...
}
2.DAO层使用了@Query注解进行查询,类似如下:
public interface DeviceDAO extends JpaRepository<Device,Integer>, JpaSpecificationExecutor<Device> {
// 使用了@Query注解,它的value属性指定了要执行的原生SQL语句,nativeQuery属性指定了是否使用原生SQL语句进行查询。
@Query(value = "SELECT * FROM device? WHERE time=?",nativeQuery = true)
Device findByTime(int deviceNum, String time);
}
3.service层正常进行调用与使用,结果可以正常使用
💎发现
当我将@Table和@SecondaryTable进行注解之后,发现还是可以正常执行,此时我产生了疑惑,发现@Query中的nativeQuery = true则实现了原生SQL语句进行数据库操作,此处补充一下原生和非原生sql的区别
原生SQL:将sql语句拷贝数据库中,再将参数进行赋值进行运行,此时我所描述的例子代码便可以解释其中的疑惑了,此处的nativeQuery = true实现了原生sql语句执行
没有nativeQuery = true时,就不是原生sql,而其中的select * from xxx中xxx也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。
所以此处使用了@Query与@Table和@SecondaryTable无关,没有什么作用,但是当使用jpa内带的方法时,还是需要设置这两个注解的