/*
 * Copyright (c) 2018, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

package jpql.query;

import java.io.Serializable;
import java.util.List;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.OneToMany;

@Entity
@NamedQueries
({
    @NamedQuery(name="address.addition",          query="SELECT a.id + 2 FROM Address a"),
    @NamedQuery(name="address.collection",        query="SELECT c FROM Address a JOIN a.customerList c"),
    @NamedQuery(name="address.concat",            query="SELECT CONCAT(a.street, a.city) FROM Address a"),
    @NamedQuery(name="address.count",             query="SELECT DISTINCT COUNT(a) FROM Address a"),
    @NamedQuery(name="address.index",             query="SELECT INDEX(c) FROM Address a JOIN a.customerList c"),
    @NamedQuery(name="address.join",              query="SELECT a FROM Address a, Employee e JOIN FETCH a.customerList, Alias s JOIN FETCH s.addresses"),
    @NamedQuery(name="address.join.fetch",        query="SELECT MOD(a.id, 2) FROM Address a JOIN FETCH a.customerList"), // SHOULD BE "SELECT MOD(a.id, 2) AS m FROM Address a JOIN FETCH a.customerList ORDER BY m"
    @NamedQuery(name="address.join.inner",        query="SELECT c FROM Address a INNER JOIN a.customerList c"),
    @NamedQuery(name="address.join.left",         query="SELECT e FROM Address a LEFT JOIN a.customerList e"),
    @NamedQuery(name="address.join.left.outer",   query="SELECT c FROM Address a LEFT OUTER JOIN a.customerList c"),
    @NamedQuery(name="address.relationship1",     query="SELECT c.dept FROM Address a LEFT OUTER JOIN a.customerList c"),
    @NamedQuery(name="address.relationship2",     query="SELECT c.lastName FROM Address a LEFT OUTER JOIN a.customerList c"),
    @NamedQuery(name="address.length",            query="SELECT LENGTH(a.street) FROM Address a"),
    @NamedQuery(name="address.locate",            query="SELECT LOCATE(a.street, 'Arco Drive') FROM Address a"),
    @NamedQuery(name="address.member",            query="SELECT a FROM Address a, Customer c WHERE c MEMBER OF a.customerList"),
    @NamedQuery(name="address.member.not",        query="SELECT a FROM Address a, Customer c WHERE c NOT MEMBER OF a.customerList"),
    @NamedQuery(name="address.size",              query="SELECT SIZE(a.customerList) FROM Address a JOIN a.customerList c"),
    @NamedQuery(name="address.stateField",        query="SELECT c.lastName FROM Address a JOIN a.customerList AS c"),
    @NamedQuery(name="address.subquery.subquery", query="SELECT e FROM Employee e WHERE 2 < ALL(SELECT a FROM Address a WHERE 2 < ANY(SELECT d FROM Dept WHERE a.city = ?1))"),
    @NamedQuery(name="address.substring",         query="SELECT SUBSTRING(a.state, 0, 1) FROM Address a")
})
@SuppressWarnings("unused")
public class Address implements Serializable {

    private static final long serialVersionUID = 1959639267574140129L;

    private String city;
    @Id
    @Column(nullable = false)
    @GeneratedValue(generator="mySequenceGeneratorName")
    private Long id;
    private String state;
    private String street;
    @Embedded
    private ZipCode zip;
    @OneToMany(mappedBy = "address")
    private List<Customer> customerList;
}
