欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中运行一下,看是否是语句出错,排除问题。