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..
You cant actually use both of them in the same application.
Yes, this should work.
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.
(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 }
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With