使用没有ID的实体

时间:2019-06-24 22:03:21

标签: java sql-server spring rest jpa

我在SQL数据库中有一个表,该表具有重复的条目(这意味着我无法创建复合键)并且没有主键。

我希望能够检索与特定列accountRef匹配的所有条目。

简而言之,我想执行以下查询:

SELECT * from table where accountRef='xyz'

其中“ xyz”将是用户输入。

我面临的问题是使用@Entity不允许我不指定ID。有办法解决这个问题吗? 这是我的代码 BasicAccountAudit.java

@XmlRootElement
@Entity
//@Embeddable
@Table(name = "tb_Account_History", schema="dbo")
public class BasicAccountAudit implements Serializable{


private String accountRef;
private String client;

//getters and setters

BasicAccountAuditRepository.java

@Repository
public interface BasicAccountAuditRepository extends CrudRepository<BasicAccountAudit, Integer> {

    List<BasicAccountAudit> findAll();

    List<BasicAccountAudit> findByAccountRef(String accountRef);
}

我尝试过的事情

我尝试使用@Embeddable,但这给了我这个错误:

  

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为'basicAccountController'的bean时出错:通过方法'setBasicAccountDao'参数0表示的不满足的依赖关系;嵌套的异常是org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“ basicAccountDaoImpl”的bean时出错:通过方法“ setBasicAccountAuditRepository”参数0表示的不满足的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为'BasicAccountAuditRepository'的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:不是托管类型:

2 个答案:

答案 0 :(得分:0)

您必须在JPA中使用简单主键或复合键,并且始终建议使用PK,也不要使用ORM。 如果您想将实体序列化为不带ID的XML(@XmlRootElement注释,提示我),则可以在ID字段上使用@XmlTransient注释,或者更好的方法是创建传输对象并仅映射那些您需要序列化的属性。 Mapstuct是使它变得容易的一个很好的选择。

答案 1 :(得分:0)

您需要一个ID才能创建实体。就这么简单。但是,您可以仅创建一个自动增量ID并忽略它。您可能不需要它,但JPA需要它。如果您已经定义了ID,则另一个选择是将UUID设置为ID,并使其自动生成。在这种情况下,您无需担心该值是什么,也不需要对其进行排序,只需提供存储库和实体的ID。

This是实现使用休眠4和spring的UUID的答案。

关于基于用户输入获取信息列表的示例,您可以定义存储库或EntityManager并自己编写脚本。接收用户的输入并将其添加到查询中,然后执行它,并返回结果。这很简单。您可以检查here的EntityManager和here的存储库。

但是问题的简短答案是,即使数据可以重复,也可以使用不需要的随机主键ID。