我正在开发一个使用HibernateSpring引导的应用程序。事实上,以前我用HibernateSpringmvc创建了一个项目,但现在我开始研究Spring引导。所以问题是我无法使用我在Springmvc中使用的hql查询获取数据。因为我不知道在Spring启动项目中在哪里写hql查询。
我尝试创建了一个类并扩展了spring-bootdao接口,并实现了我的方法,但没有获得正确的数据。
下面是我之前的spring mvc代码。
我创建了一个实体类Rating.java和一个道类,这是我的Rating.java
@Entity
@Table(name = "rating")
public class Rating {
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name="author_id")
private long authId;
@Id
@Column(name="post_id")
private long postId;
@Column(name="rating_points")
private long points;
public Rating() { }
public Rating(long id) {
this.id = id;
}
public Rating(long authId, long postId, long points) {
this.authId = authId;
this.postId = postId;
this.points = points;
}
//Getters and setters
}
我的Springmvc DAO类
@SuppressWarnings("unchecked")
public List<Rating> getRatingInfoById(long id) throws Exception {
session = sessionFactory.openSession();
String queryString = "select r.id from Rating r where r.postId=:id group by points";
Query query = session.createQuery(queryString);
query.setLong("id", id);
return query.list();
}
我的Spring靴代码。
DAO接口
@Transactional
public interface MyDaoInterface extends CrudRepository<Rating, Long>{
public List<Rating> getRatingInfoById(long id) throws Exception;
}
我的DAO类,我实现了dao接口方法
public class MyDao implements MyDaoInterface{
@Autowired
SessionFactory sessionFactory;
Session session = null;
Transaction tx = null;
@SuppressWarnings("unchecked")
public List<Rating> getRatingInfoById(long id) throws Exception {
session = sessionFactory.openSession();
String queryString = "select r.id from Rating r where r.postId=:id group by points";
Query query = session.createQuery(queryString);
query.setLong("id", id);
return query.list();
}
}
看起来您使用了spring-data (CrudRepository ),所以查询应该在接口(MyDaoInterface)中定义。
我不确定使用带有 Spring-data 的 SessionFactory 是一个好主意,使用 Spring-Data-JPA 会更容易(但对于 JPA impl 仍然带有Hibernate状态)
你应该有一个这样的配置类(看http://docs . spring . io/spring-data/JPA/docs/current/reference/html/# JPA . Java-config):
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public EntityManagerFactory entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
return txManager;
}
}
您必须从方法名称创建查询,这里有更多解释:http://docs.spring.io/spring-data/data-commons/docs/current/reference/html/#repositories.query-方法.query-创建
如果您不能从方法名中做到这一点,您仍然可以在方法接口上使用< code>@Query。
您可以扩展JpaRepostory
而不是扩展CrudRepostory
(提供更多泛型方法)
对于< code>@Transactional来说,最好将它用于服务层中定义的方法(服务调用DAO层,例如,如果其中一个服务负责创建一个用户和一个角色,如果它失败了,您希望回滚所创建的用户和角色!)
我想在不使用元组的情况下,从这个查询中得到DTO的结果。 @Repository公共界面CustomMapRepository扩展了JpaRepository{ } 公共类CustomMapDTO实现可序列化{ //..接受者和接受者}
问题内容: 我已经在mysql上创建了HEAP(ram)表,以实现更快的查询。但是在mysql服务器重启后,我的堆表中的数据没有被加载。 我的正常的表名: 产品 与ID,PRODUCT_NAME,地位的MyISAM id = >整数和auto_increment,主键 product_name = > var_char和键(索引) 状态= >布尔值 实际查询: 我想提高速度,所以我创建了具有相同结
问题内容: 我正在研究hibernate和何时使用的情况,我的理解是,在hibernate中,每次我们通过一个实例或两个实例查询数据库时,hibernate都会获取结果集并将其存储在内存中,然后当我们再次调用该查询时,数据将从内存中获取而不是访问该数据库,我的理解正确吗? 另外,正如您从下面提到的问题注释中看到的那样,建议Hibernate Criteria从会话中获取数据,并且HQL始终会访问数
几天来,我一直在尝试使用WebFlux在Spring启动中运行一个简单的H2/R2dbc数据库。该应用程序启动正常,但当我调用 /todosendpoint以获取数据库中的所有对象时,我收到以下错误: 我的理解是,如果我用创建表命令在类路径上添加一个schema.sql文件,它将在启动时使用它来创建表,但看起来这并不起作用。对我可能做错了什么有什么想法吗?任何帮助都将不胜感激,我想得到的是一个工作
问题内容: 在Hibernate 3中,有没有办法等效于HQL中的以下MySQL限制? 如果可能的话,我不想使用setMaxResults。这肯定在较旧的Hibernate / HQL版本中是可行的,但似乎已经消失了。 问题答案: 几年前,当有人问到为什么它在Hibernate 2中有效但在Hibernate 3中无效时,此消息发布在Hibernate论坛上: 在HQL中,从不支持Limit 子句
使用执行hql查询时出现错误 我的疑问是 堆栈跟踪是