2
私はこの質問に対する回答をかなり探しました。フォローするコード:質問ビルダーを使用して埋め込みエンティティをクエリする方法
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@Column(nullable = true, length = 50)
@Size(max = 50)
private String name;
@Embedded
@Valid
protected Adress adress;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public void getName() {
return this.name;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
public void getAdress() {
return this.adress;
}
}
@Embeddable
public class Adress {
@Column(nullable = false, length = 50)
@Size(max = 50)
@NotNull
private String place;
public void setPlace(String place) {
this.place = place;
}
public void getPlace() {
return this.place;
}
}
public class PersonDaoJpa {
public List<Ort> findByPerson(final Person person) {
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> rootPerson = query.from(Person.class);
List<Predicate> wherePredicates = new ArrayList<Predicate>();
if (person.getName() != null) {
wherePredicates.add(builder.like(builder.lower(rootPerson.<String>get("name")), ort.getName().toLowerCase()));
}
Adresse adresse = ort.getAdresse();
if (adresse != null) {
if(adresse.getPlace() != null) {
// this won't work
wherePredicates.add(builder.like(builder.lower(rootPerson.<String>get("person.adress.place")), adresse.getPlace().toLowerCase()));
}
}
Predicate whereClause = builder.and(wherePredicates.toArray(new Predicate[0]));
query.where(whereClause);
return this.entityManager.createQuery(query).getResultList();
}
}
rootPersonからAdress.placeにアクセスするにはどうすればよいですか? rootPerson.get( "場所")、またはrootPerson.get( "adress.place")は動作しません...
小さな補正と、それは魅力のように動作します。 – myAces
訂正: \tここで、Adder.getPlace()、adresse.getPlace()、adresse.getPlace() .toLowerCase())); – myAces