当前位置: 首页 > 知识库问答 >
问题:

在 Spring 启动中运行 hql 查询时未获得任何结果

赵渊
2023-03-14

我正在开发一个使用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();
}

}

共有1个答案

梁季
2023-03-14

看起来您使用了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查询时出现错误 我的疑问是 堆栈跟踪是