JPA 编写sql语句 以及动态拼接sql语句
程序员文章站
2022-04-21 15:40:21
...
JPA SQL语句编写方式
刚刚接触JPA 如有不对地方欢迎指教。
第一种
// ClassName表示新建类名 CLass 表示要查询的类
// String 表示查询类的id类型
public interface ClassName extends JpaRepository<Class, String>, JpaSpecificationExecutor<Class>{
// 查询所有值 这里的表名就是要查询的类名 t 表示表的别名 也代替 *
@Query(value = "SELECT t FROM CLass t ")
List<Class> findAll();
}
// 还有一种写法 这里可以用原生的sql语句 查询的就是数据库中的表名
// nativeQuery = true 默认为false true 为执行原生sql
@Query(value = "SELECT * FROM tableName ", nativeQuery = true)
List<Class> findAll();
// 带参数的查询方式
// 这里的 :为占位符 用@Param 注解来引入数据
//且与占位名称和传入名称一致
@Query(value = "SELECT t FROM CLass t where t.id = :id")
List<Class> findById(@Param("id")String id);
还有一种占位符是 ? 和:类似 但使用这个可以不用注解,但是传入顺序要和注入的条件一致 1代表id 2代表name
@Query(value = "SELECT t FROM CLass t where t.id = ?1 and t.name = ?2")
List<Class> findById(String id,String name);
以上的自定义方法,如果需要新增删除或者更新的话,需要添加注解
@Transactional
@Modifying
@Query
如果出现脏读问题可以添加
@Modifying(clearAutomatically = true)
详情可以看一下博客
https://www.jianshu.com/p/faecffa6ee3f
第二种
在方法中写查询语句
这里要在类中注入
import javax.persistence.EntityManager;
@Resource
private EntityManager entityManager;
public void findAll() {
String sql;
sql = "select * from tableName ";
Query nativeQuery = entityManager.createNativeQuery(sql);
List resultList = nativeQuery.getResultList();
for (Object row : resultList) {
Object[] cells = (Object[]) row;
System.out.println(cells[0]);
System.out.println(cells[1]);
}
}
这里可以手动拼接参数到sql语句中,满足需求
具体的返回类型可以参考以下网址,讲解的很详细
https://www.cnblogs.com/codingmengmeng/p/10758222.html
这个方法如果传入条件,需要在条件的两端加 ’ ’ 不然执行sql语句会报错
如下方式
sql = "select * from tableName where id = " + "'" + id + "'";
也可以输出一下sql语句,去mysql中运行一下,看是否是语句出错,排除问题。