- Иметь электронное письмо с электронной почтой Строго и
- Иметь телефон сопоставления телефона restricty и
- , который больше, чем возраст> Age> Age> Age, Age> Age> Age> STRICTLY AGRE
- . и
- Имеют имя, похожее на 'name%'
import com.example.pixel_user_api.data.entity.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.data.repository.query.Param;
import java.time.LocalDate;
import java.util.List;
@RepositoryDefinition(domainClass = User.class, idClass = Long.class)
public interface UserRepository {
@Query("""
SELECT User u
JOIN FETCH PhoneDate pd
JOIN EmailData ed
WHERE (:dateOfBirth IS NULL OR u.dateOfBirth > :dateOfBirth)
AND (:phone IS NULL OR pd.phone = :phone)
AND (:name IS NULL OR u.name LIKE ':name%')
AND (:email IS NULL OR ed.email = :email)
""")
List find(@Param("dateOfBirth") LocalDate dateOfBirth,
@Param("phone") String phone,
@Param("name") String name,
@Param("email") String email,
Pageable pageable);
}
< /code>
По -видимому, два соединения в одном запросе JPQL являются незаконными (из -за выпуска декартового продукта, я полагаю,). Мое приложение не работает при запуске: < /p>
Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: At 2:0 and token 'JOIN', mismatched input 'JOIN', expecting one of the following tokens: , ',', EXCEPT, FROM, GROUP, HAVING, INTERSECT, ORDER, UNION, WHERE;
< /code>
Итак, как мне провести поиск, включающий более чем один связан с «до-м-мэ-сущностью»-с учетом хранилища данных?import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
@Getter
@Setter
public class FindUserRequestDto {
private LocalDate dateOfBirth;
private String phone;
private String name;
private String email;
private int pageNumber;
private int pageSize;
}
< /code>
My Entities (упрощенное): < /p>
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.util.List;
@Entity
@Getter
@Setter
@Table(name = "\"user\"")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(name = "date_of_birth")
private LocalDate dateOfBirth;
@OneToOne(mappedBy = "user")
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER,
cascade = CascadeType.ALL, orphanRemoval = true)
private List emailData;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER,
cascade = CascadeType.ALL, orphanRemoval = true)
private List phoneData;
}
< /code>
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name = "phone_data")
public class PhoneData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private String phone;
}
< /code>
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name = "email_data")
public class EmailData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private String email;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... attributes