Как найти данные с помощью поля соединения в объекте с динамическим запросом - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу запросить свойство в соединительной таблице.Созданная спецификация основана на динамическом запросе, созданном на основе пользовательского запроса.

Я использую динамическое создание спецификации на основе статьи ниже.https://www.baeldung.com/rest-api-query-search-language-more-operations

Запрос работает нормально, когда я запрашиваю основные элементы.Я хочу запросить элементы в таблице соединений с помощью динамического запроса.Я получаю сообщение об ошибке «Невозможно найти атрибут»

@Entity
@Table(name = "user")
public class UserEntity {
@Getter @Setter
@Id
@Column(name = "id")
private String id;

@Getter @Setter
@Column(name = "firstName")
private String firstName;

@Setter @Getter
@OneToOne(fetch = FetchType.EAGER, optional = true, cascade=CascadeType.ALL)
@JoinColumn(name = "deviceId", nullable = false)
private DeviceEntity device;
}


@Repository
public interface UserRepository extends CrudRepository<UserEntity, String>, JpaSpecificationExecutor<UserEntity> {
}

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "device") 
public class DeviceEntity {
    @Id
@Column(name = "id")
private String id;

@Column(name = "serialNumber", nullable = false)
private String serialNumber;
}
  1. Как запросить serialNumber из UserRepository с помощью динамического запроса?
  2. Как сослаться на свойство serialNumber в запросе?«device.serialNumber» не работает.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я использовал тот, что ниже.Корень всегда будет указывать на основную сущность, а для составных сущностей мне нужно получить путь для этого и добавить элемент.Я использую картограф для сопоставления объектов для статического сопоставления.

        protected void loadSearchParameterMappings() {
        getSearchParameterMappings().put("id", "id");
        getSearchParameterMappings().put("firstName", "firstName");
        getSearchParameterMappings().put("lastName", "lastName");
        getSearchParameterMappings().put("email", "email");
        getSearchParameterMappings().put("serialNumber", "device.serialNumber");
        getSearchParameterMappings().put("phoneNumber", "device.phoneNumber");
    }


 private Path<String> getParameterPath(final Root<T> root) {

        String[] keys = criteria.getKey().split("\\.");

        Path<String> path = null;

        for (String key : keys) {
            path = (path != null) ? path.get(key) : root.get(key);
            // verify all the mappings are done correctly or this mapping is not supported
            if (path == null) {
                throw new 
InvalidSearchParameterException(ErrorCode.INVALID_SEARCH_PARAM, key);
            }
        }

        if (path == null) {
            throw new InvalidSearchParameterException(ErrorCode.INVALID_SEARCH_PARAM, criteria.getKey());
        }

        return path;
    }
0 голосов
/ 26 декабря 2018

Вы присоединяетесь, чтобы присоединиться к DeviceEntity

    Join<DeviceEntity, Site> device = root.join("device");
    return Specification.where(cb.equal(device.get("serialNumber"), deviceSerialNumber))
.and(cb.equal("serialNumber"), serialNumber))
...