Hibernate5+sqlserver2008 分页问题



Hibernate 发布了最新版本 5.2,恰好公司要做个新项目,我是比较喜欢冒险的,所有决定采用 spring4+Hibernate5,各种搜索,各种配置之后,框架终于跑起来了,当测试到分页的时候出现了一个很意外的错误,下面详细描述下错误的过程

1、分页代码

public  List<Map<String,Object>> findByPageMap(final String hql, final Object[] params,
   final int pageNo, final int maxResults)
   throws Exception{
  Query queryObject = getSession().createQuery(hql);
  if (pageNo<1)
   throw new Exception("pageNo 必须大于 0");
  int firstResult=(pageNo-1)*maxResults;
  if (params != null) {
   for (int i = 0; i < params.length; i++) {
    queryObject.setParameter(i, params[i]);
   }
  }
  queryObject.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  queryObject.setFirstResult(firstResult); 
  queryObject.setMaxResults(maxResults); 
  return  (List<Map<String,Object>>)queryObject.list();
 }

很简单不必解释

(ps:原本使用Hibernate5.2 的,因为5.2有一些被取消的的方法例如setResultTransformer()我没找到替代的方法,所以放弃)

运行test测试,出现了一个很诡异的错误

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper:131 - '@P0' 附近有语法错误。

输出的sql语句为 select        TOP ?  ticketsell0_.detail_id as detail_i1_1 from     TicketSell_detail ticketsell0_

以前从来没出现这个现象,

检查代码 没有可改之处

于是各种替换排除  把 阿里数据源换成c3p0  Hibernate5.2 降级 5.1  现象依旧

度娘也没有给出答案,最后目光放在了数据方言上

原来这么写的

hibernate.dialect=org.hibernate.dialect.SQLServerDialect

换框架之前 一直好使的,在翻看了源码后 发现Hibernate对sqlserver的版本进行了细化

于是改成

hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect


测试通过

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Hibernate和SQL Server上使用Atomikos进行事务管理的整合可以按照以下步骤进行: 1. 添加Atomikos和SQL Server的相关依赖项到你的项目中。你可以在Maven或Gradle中添加以下依赖项: ```xml <!-- Atomikos --> <dependency> <groupId>com.atomikos</groupId> <artifactId>atomikos-transactions-jta</artifactId> <version>4.0.6</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>atomikos-transactions-jdbc</artifactId> <version>4.0.6</version> </dependency> <!-- SQL Server --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.2.2.jre8</version> </dependency> ``` 2. 配置Atomikos的事务管理器。在Spring Boot中,可以使用`JtaTransactionManager`来配置Atomikos。 ```java @Configuration public class TransactionConfig { @Bean public UserTransactionManager userTransactionManager() throws SystemException { UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setForceShutdown(true); return userTransactionManager; } @Bean(initMethod = "init", destroyMethod = "close") public UserTransactionImp userTransaction() throws SystemException { UserTransactionImp userTransactionImp = new UserTransactionImp(); userTransactionImp.setTransactionTimeout(300); return userTransactionImp; } @Bean public JtaTransactionManager transactionManager(UserTransactionManager userTransactionManager, UserTransactionImp userTransaction) { JtaTransactionManager transactionManager = new JtaTransactionManager(); transactionManager.setUserTransaction(userTransaction); transactionManager.setTransactionManager(userTransactionManager); return transactionManager; } } ``` 3. 配置SQL Server的数据源。可以使用Spring Boot的自动配置来配置SQL Server的数据源。 ```properties spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=mydatabase spring.datasource.username=your-username spring.datasource.password=your-password spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.jpa.hibernate.ddl-auto=update ``` 4. 使用Hibernate进行数据库访问。在你的实体类上使用Hibernate的注解来映射数据库表。 ```java @Entity @Table(name = "your_table") public class YourEntity { // Entity fields and annotations } ``` 5. 在需要进行事务管理的方法或类上使用`@Transactional`注解。这将确保方法内的数据库操作在Atomikos管理的事务中执行。 ```java @Service @Transactional public class YourService { // Service methods } ``` 通过按照以上步骤配置Atomikos和SQL Server的整合,你可以实现对Hibernate和SQL Server的分布式事务管理。Atomikos将协调和管理涉及多个数据库的事务,确保事务的一致性和原子性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iceheartboy2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值