Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using @EmbeddedId with JpaRepository

I have simple Entitly class with the @EmbeddedId (Integer and String fields in separate class). And I use the Spring Data (org.springframework.data.jpa.repository.JpaRepository) to access the database (MySql), with the normal Id the queries are working fine, both the generated by Spring and the ones wrote by myself. With the EmbeddedId I didnt manage to create the correct query. What I want to do is to select all the id (one of the fields of embeddedId for which some condition occurs) Here you have some code samples, maybe somebody will have an idea how to solve it.
The entity class:

@Entity @Table(name="table_name") public class EntityClass {      @EmbeddedId     private EmbeddedIdClass id;     private String  someField;     //rest of implemetation } 

the EmbeddedId class:

@Embeddable public class EmbeddedIdClass implements Serializable {  public EmbeddedIdClass(Long id, String language) {     super();     this.id = id;     this.language = language; }  public UserAdTextId() {}          @Column(name="ad_id", nullable=false)     private Integer id;      @Column(name="language_code", nullable=false)     private String  language;     //rest of implemetation } 

and the repository:

@Transactional(readOnly=true) public interface MyRepository extends JpaRepository<EntityClass, EmbeddedIdClass> {     @Query("select distinct ad_id from EntityClass where userId = :userId and (/*here the conditions*/)")     public Page<Integer> findUserAdsWithSearchString(@Param("userId") Integer userId, @Param("searchString") String searchString, Pageable page); //rest of implemetation } 

I didn't find any documentation how to create the methods for supporting the @EmbeddedId, I was trying many different method names, but I always get exceptions from the method parser..

like image 633
Mat Avatar asked May 18 '12 09:05

Mat


People also ask

Can we use Spring data JPA and Hibernate together?

You cant actually use both of them in the same application.

Can we use JPA with r2dbc?

Yes, this should work.

What is @EmbeddedId in JPA?

JPA can be used to efficiently map composite keys and query them via derived queries. In this article, we saw a small example of running a partial id field search. We looked at the @Embeddable annotation to represent the composite primary key and the @EmbeddedId annotation to insert a composite key in an entity.


2 Answers

(by Yosi Lev) This can be done as the following: Suppose your main entity is:

@Entity @Table(name="JRULES_FLOW") public class JrulesFlow implements Serializable {    private static final long serialVersionUID = 1L;     @EmbeddedId    private JrulesFlowPK id;     @Column(name="NEXT_SEQ")    private int nextSeq;     @Column(name="REF_ID")    private String refId;     @Column(name="TASK_TYPE")    private String taskType;     @Column(name="VALUE_TO_FIND")    private String valueToFind; } 

And your PK class is :

@Embeddable public class JrulesFlowPK implements Serializable {    //default serial version id, required for serializable classes.    private static final long serialVersionUID = 1L;     @Column(name="FLOW_ID")    private String flowId;     @Column(name="TASK_SEQ")    private long taskSeq;  } 

The JPA repository method name shouls include the name of the id field in the main class followed by the property you want to query uppon within the PK class:

public interface JrulesFlowRepository extends JpaRepository<JrulesFlow,        JrulesFlowPK> { // NOTE: put here both classes - also the pk class..    public List<JrulesFlow>  findByIdFlowId(String flowId);  // Id - is the                    // @EmbeddedId in JrulesFlow. FlowId is an attribute                    // within JrulesFlowPK } 
like image 153
ylev Avatar answered Sep 24 '22 22:09

ylev


It seems your query is using column names. It should contain the property names, including navigation into embedded objects. There's also a related question here on SO: How to write JPQL SELECT with embedded id?

select distinct id.id from EntityClass where userId = :userId and (...) 

The first id refers to attribute id of EntityClass (of type EmbeddedIdClass), and the second one refers to the id property of EmbeddedIdClass.

Also, make sure there's a userId property in EntityClass.

like image 30
Xavi López Avatar answered Sep 26 '22 22:09

Xavi López