如何从接口方法定义中调用@NamedQueries?

时间:2014-06-25 18:30:42

标签: java spring jpa spring-data-jpa

我是Spring Framework的新手,我想知道是否可以调用实体命名查询,只在界面上定义命名查询而不进行任何实现。

我想做这样的事情。

NamedQuery(name = "StateBo.findByCountry", query = "SELECT state FROM StateBo state WHERE state.country.id = ?")
@Table(name = "STATE")
@Entity(name = "StateBo")
public class StateBo extends BaseNamedBo {

  private static final long serialVersionUID = 3687061742742506831L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "STATE_ID")
  private Long id;

  @Column(name = "ISO_CODE")
  private String isoCode;

  @ManyToOne
  @JoinColumn(name = "COUNTRY_ID")
  private CountryBo country;

  // getters and setters ...
}

我定义了命名查询 StateBo.findByBCountry ,我的界面看起来像这样

public interface IStateDao extends JpaRepository<StateBo, Long> {

    public List<StateBo> findByCountry(Long id);

}

接口实现看起来像这样。

@Transactional
@Repository("stateDao")
public class StateDao implements IStateDao {

}

但我有错误,我必须实现我在我的界面上定义的方法,但我不想这样做。我只想定义我的命名查询,并在我的接口中使用与实体相同的名称定义方法,并且不添加该方法的实现,因为实现基本上是字符串命名查询

1 个答案:

答案 0 :(得分:0)

您可以使用Spring Data Jpa项目。 首先,您会看到https://spring.io/guides/gs/accessing-data-jpa/

要在没有实现(仅限界面)的情况下执行查询,请参阅http://docs.spring.io/spring-data/jpa/docs/1.6.0.RELEASE/reference/htmlsingle/#jpa.query-methods.at-query

基本上你不需要实施:

@Transactional
@Repository("stateDao")
public class StateDao implements IStateDao {

} 

尝试删除它,看看会发生什么。