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

复合Id JPA2和Spring数据不工作

琴俊良
2023-03-14

我使用JPA2映射了以下实体:

@Entity
public class Translation {

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

private String locale;

@Column(name = "business_code",insertable = true,updatable = false,length = 200,nullable = false)
private String code;

private String text;

// Gettets and setters
....
}

然后我意识到than对(locale,code)应该是唯一的,所以我将实体更改为由locale,code组成的embeddedId,并从映射中删除了列id。这样,这一对将充当主键,它们不能重复:

结果:

@Entity 
public class Translation {

@EmbeddedId
private TranslationId translationId;

private String text;

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public TranslationId getTranslationId() {
    return translationId;
}

public void setTranslationId(TranslationId translationId) {
    this.translationId = translationId;
}

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}
}
@Embeddable
public class TranslationId implements Serializable{

private static final long serialVersionUID = 1L;

private String locale;

@Column(name = "business_code",insertable = true,updatable = false,length = 200,nullable = false)
private String code;

@Override
public boolean equals(Object obj){
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode(){
    return HashCodeBuilder.reflectionHashCode(this);
}

public String getLocale() {
    return locale;
}

public void setLocale(String locale) {
    this.locale = locale;
}

public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}
}
@Repository
public interface TranslationRepository extends   JpaRepository<Translation,TranslationId> {

}

共有1个答案

朱令
2023-03-14

既然你的第一个问题已经解决了,我来回答第二个问题

我想让Spring数据只按区域设置(而不是按代码)查询所有翻译,我怎么做?

locale仍然可以通过translationid作为单个属性访问。在JPQL中,您可以编写

SELECT t FROM Translation t WHERE t.translationId.locale = :locale
@Query("SELECT t FROM Translation t WHERE t.translationId.locale = :locale")
public List<Translation> findByLocale(@Param("locale") String locale)
public List<Translation> findByTranslationIdLocale(String locale)
 类似资料:
  • 我在使用聚合框架从MongoDB读取文档时遇到了问题:我的结果中总是得到空ID。这只发生在具有复合ID的文档中。我尝试了各种版本的spring-data-mongob(1.10.12, 2.0.7),结果相同。 实体定义类 测试代码 输出 调试到以下方法MappingMongoConverter。read(final mongopersistenentity entity、final Docume

  • 我有一些代码可以循环遍历值并更改表中的条目。变量$change_val、$column和$id的5个值都正确地回显了,所以我假设bindParam的用法有问题(但我不确定它是什么)。 $_POST语句之所以存在,是因为我想要的值实际上是从另一个文件传递的。不过,当我在循环中放置适当的echo语句时,它们都会打印出正确的值。 我也试过bindValue,但也没用。我看不到任何错误,至少编译得很顺利,

  • 我想让用户节点中的userName属性作为唯一。我使用了下面的代码,但它没有在Neo4j数据库中创建唯一的约束。 仅供参考,我使用的是Neo4j服务器版本:3.3。6(社区)带Spring靴2 但是如果我自己在Neo4j浏览器中创建一个约束,它就会工作。 有没有一种方法可以强制Spring Data Neo4J创建唯一的属性,而不需要自己在数据库中创建它们?

  • 我是neo4j spring数据的新手,我尝试执行的查询不是在我的spring boot应用程序上工作,而是在neo4j web界面上工作。 我在数据库上有3个节点:“Oracle”、“Java”和“Cloud”我正在尝试运行的查询: 因此,使用neo4j web界面,如果我输入“CL”,它将返回“Oracle”和“Cloud”,这是正确的。 使用spring数据,我得到了所有3个结果,这是错误的

  • 我想用Rxjava使用ROOM,以下是我的代码: 我的数据库结构类: 这是我的ProductDAO课程: 这是我用于创建和管理数据库的数据库类: 这是我处理数据库的活动: 下面是发生的情况,当我第一次启动我的activity类时,没有发生错误,当我从emulator下载创建的数据库并在sqlite数据库管理器中打开它时,问题是文件是空的,没有创建数据库 当我回去重新打开数据库时,我得到了很多错误:

  • 我需要合并两个不同大小的数据帧。较大的一个()有一列有几个重复的值(),较短的一个()有列,但其值不重复。df2还有一个ID列。我需要在中使用中的ID的新列,根据中的重复值重复。下面的例子可能会让它更清楚。 .