2016-09-28 2 views
0

Я использую платформу Play2.0 для API-интерфейса. Поэтому я хочу перечислить Rides из базы данных, и я хочу исключить Ride, у которого есть дублирующее «место».Исключить дублированные данные из PagedList

Я использую этот код, но это дает мне всю запись Rides, которая хранится в базе данных. Как исключить дублирование записи?

Вот Java-код

public List<RideDTO> recent(long userId, int cursor, int count) { 
     PagedList<RideDTO> pagedList = RideDTO.find 
       .where() 
       .eq("user_id", userId) 
       .orderBy("created_on desc") 
       .findPagedList(cursor, count); 
     if (pagedList == null) 
      return null; 
     else 
      return pagedList.getList(); 
    } 

А вот модель класса RideDTO. Я не хочу оставаться уникальным в базе данных.

@Entity 
@Table(name = "m_ride") 
//@UniqueConstraint(columnNames = {"place"}) 
public class RideDTO extends Model { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@NotNull 
@Constraints.Required 
private long id; 

@ManyToOne 
@NotNull 
@Constraints.Required 
private UserDTO user; 

@NotNull 
@Constraints.Required 
private String place; 

@NotNull 
@Constraints.Required 
private double startLat; 

@NotNull 
@Constraints.Required 
private double startLng; 

@NotNull 
@Constraints.Required 
private double destLat; 

@NotNull 
@Constraints.Required 
private double destLng; 

private double currLat; 

private double currLng; 

@NotNull 
@Constraints.Required 
private short isFav; 

private String image; 

@NotNull 
@CreatedTimestamp 
@Constraints.Required 
private Date createdOn; 

@Transient 
private double distance; 

public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public UserDTO getUser() { 
    return user; 
} 

public void setUser(UserDTO user) { 
    this.user = user; 
} 

public String getPlace() { 
    return place; 
} 

public void setPlace(String place) { 
    this.place = place; 
} 

public double getStartLat() { 
    return startLat; 
} 

public void setStartLat(double startLat) { 
    this.startLat = startLat; 
} 

public double getStartLng() { 
    return startLng; 
} 

public void setStartLng(double startLng) { 
    this.startLng = startLng; 
} 

public double getDestLat() { 
    return destLat; 
} 

public void setDestLat(double destLat) { 
    this.destLat = destLat; 
} 

public double getDestLng() { 
    return destLng; 
} 

public void setDestLng(double destLng) { 
    this.destLng = destLng; 
} 

public double getCurrLat() { 
    return currLat; 
} 

public void setCurrLat(double currLat) { 
    this.currLat = currLat; 
} 

public double getCurrLng() { 
    return currLng; 
} 

public void setCurrLng(double currLng) { 
    this.currLng = currLng; 
} 

public short getIsFav() { 
    return isFav; 
} 

public void setIsFav(short isFav) { 
    this.isFav = isFav; 
} 

public String getImage() { 
    return image; 
} 

public void setImage(String image) { 
    this.image = image; 
} 

public Date getCreatedOn() { 
    return createdOn; 
} 

public void setCreatedOn(Date createdOn) { 
    this.createdOn = createdOn; 
} 

public double getDistance() { 
    return distance; 
} 

public void setDistance(double distance) { 
    this.distance = distance; 
} 

@Override 
public String toString() { 
    return "RideDTO{" + 
      "id=" + id + 
      ", user=" + user + 
      ", place='" + place + '\'' + 
      ", startLat=" + startLat + 
      ", startLng=" + startLng + 
      ", destLat=" + destLat + 
      ", destLng=" + destLng + 
      ", currLat=" + currLat + 
      ", currLng=" + currLng + 
      ", isFav=" + isFav + 
      ", image='" + image + '\'' + 
      ", createdOn=" + createdOn + 
      ", distance=" + distance + 
      '}'; 
} 

public static final Finder<Long, RideDTO> find = new Finder<Long, RideDTO>(Long.class, RideDTO.class); 
} 

ответ

1

Может не тестовый код здесь (я на работе)

Есть несколько вариантов, вы можете:

  • ли это на уровне базы данных (мой предпочтительный путь, потому что это быстрее)

  • Призыв к .stream() и сделать некоторые сортировки

Попробуйте это:

public List<RideDTO> recent(long userId, int cursor, int count) { 
     PagedList<RideDTO> pagedList = RideDTO.find.select("*") 
       .where() 
       .eq("user_id", userId) 
       .orderBy("created_on desc") 
       .setDistinct(true) 
       .findPagedList(cursor, count); 

      return pagedList.getList(); 
    } 

всего несколько нот, вы не должны возвращать нуль в Ebean, просто проверить list.isEmpty() в вашем представлении.

Ebean не собирается выбрасывать исключение нулевой указатель.

Редактировать: Как указывалось в комментарии, я не задал значение, которое должно быть разным.

При использовании setDistinct в Ebean мы должны использовать его с выбрать.

От docs

Набор использует ли этот запрос DISTINCT. Предложение select() ДОЛЖНО указываться при установке setDistinct (true). Причиной этого является то, что в общем случае запросы ORM включают свойство id, и это не имеет смысла для разных запросов.

List<Customer> customers = 
     Ebean.find(Customer.class) 
     .setDistinct(true) 
     .select("name")  // only select the customer name 
     .findList(); 
+0

Вам не хватает важной части, для которой вы используете 'DISTINCT'. Здесь колонка 'place' – Sivakumar

+0

@Sivakumar, спасибо. –

+0

Спасибо, товарищи. Я проверю следующий ответ, а потом вернусь к вам, ребята. –

Смежные вопросы