Java JPQL多个单向查询

Java JPQL多个单向查询,java,many-to-many,entity,jpql,jointable,Java,Many To Many,Entity,Jpql,Jointable,我一直在论坛上到处寻找一个单向的很多问题。我发现了许多例子,但我无法真正根据自己的需要调整它们:( 我有2个实体类(动画和用户) 动画{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“anime\u id”) 私有整数id; //其他领域等。 } 使用者{ @身份证 @ValidUsername @列(name=“user\u id”) 私有字符串用户名; @许多 @JoinTable(name=“users\u animes

我一直在论坛上到处寻找一个单向的很多问题。我发现了许多例子,但我无法真正根据自己的需要调整它们:(

我有2个实体类(动画和用户)

动画{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“anime\u id”)
私有整数id;
//其他领域等。
}
使用者{
@身份证
@ValidUsername
@列(name=“user\u id”)
私有字符串用户名;
@许多
@JoinTable(name=“users\u animes”,
joinColumns=@JoinColumn(name=“anime\u id”,referencedColumnName=“anime\u id”),
inverseJoinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“user\u id”))
私有最终列表动画=新ArrayList();
}
动画只是保存动画中的数据。 用户持有用户的用户名等,以及他订阅的动画列表

现在,我正试图找到一个查询,让我得到列表中的所有动画。 它被映射到一个表中作为“用户\动画”

这将是一个巨大的帮助,因为我是JPQL的新手


谢谢!

这里有一个简单的例子。假设我们有一个国家实体,它可以有多个公民:

@Entity
@Table (name = "countries")
public class Country implements Serializable {

    @Id
    @Column (name = "coun_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column (name = "country_name")
    private String countryName;

    @ManyToMany (cascade = CascadeType.ALL)
    @JoinTable (
            name = "citizen_country",
            joinColumns = @JoinColumn (name = "country_id", referencedColumnName = "coun_id"),
            inverseJoinColumns = @JoinColumn (name = "citizen_id", referencedColumnName = "cit_id")
    )
    private List<Citizen> citizens;

    public Country() {}
    public Country(String countryName) {
        this.countryName = countryName;
    }
    //getters and setters
}
它是单向的,正如您所希望的那样。因此,公民实体不知道国家,因此您无法直接获取某个公民属于哪个国家的信息。但是,您可以检索关于某个国家哪些公民的信息

更进一步,您可以填充表格:

    Citizen citizen1 = new Citizen("Smith");
    Citizen citizen2 = new Citizen("Kowalski");
    Citizen citizen3 = new Citizen("Muller");
    dataAccess.saveCitizen(citizen1);
    dataAccess.saveCitizen(citizen2);
    dataAccess.saveCitizen(citizen3);

    // now let's fetch them from DB, along with their other properties (only id in this case)
    citizen1 = dataAccess.getCitizenByName("Smith");
    citizen2 = dataAccess.getCitizenByName("Kowalski");
    citizen3 = dataAccess.getCitizenByName("Muller");

    Country country1 = new Country("Foo");
    Country country2 = new Country("Bar");

    // create lists to hold citizens for each country
    List<Citizen> citizenList1 = new ArrayList();
    List<Citizen> citizenList2 = new ArrayList();

    // add elements to the lists
    citizenList1.add(citizen1);
    citizenList1.add(citizen2);        
    citizenList2.add(citizen2);
    citizenList2.add(citizen3);

    //assign lists of citizens to each country
    country1.setCitizens(citizenList1);
    country2.setCitizens(citizenList2);

    //save data in DB
    dataAccess.saveCountry(country1);
    dataAccess.saveCountry(country2);

    //fetch list of all persisted countries (associated Citizens will come along)
    countries = dataAccess.getAllCountries();
Citizen公民1=新公民(“史密斯”);
公民2=新公民(“科瓦尔斯基”);
公民3=新公民(“穆勒”);
dataAccess.saveCitizen(citizen1);
dataAccess.saveCitizen(citizen2);
dataAccess.saveCitizen(citizen3);
//现在,让我们从DB中获取它们,以及它们的其他属性(本例中只有id)
citizen1=dataAccess.getCitizenByName(“史密斯”);
citizen2=dataAccess.getCitizenByName(“Kowalski”);
citizen3=dataAccess.getCitizenByName(“Muller”);
国家1=新国家(“Foo”);
国家2=新国家(“酒吧”);
//创建列表以容纳每个国家的公民
List citizenList1=new ArrayList();
List citizenList2=new ArrayList();
//向列表中添加元素
citizenList1.add(citizen1);
公民名单1。添加(公民2);
citizenList2.add(citizen2);
citizenList2.add(citizen3);
//为每个国家分配公民名单
国家1.setCitizens(公民名单1);
国家2.setCitizens(公民名单2);
//在数据库中保存数据
dataAccess.saveCountry(country1);
dataAccess.saveCountry(country2);
//获取所有保留国家/地区的列表(相关公民将随附)
countries=dataAccess.getAllCountries();
最后:

@Stateless
public class DataAccess {

    @PersistenceContext
    EntityManager em;

    public void saveCountry(Country country) {
        em.persist(country);
    }

    public void saveCitizen(Citizen citizen) {
        em.persist(citizen);
    }

    public Citizen getCitizenByName(String name) {
        Query query = em.createQuery("SELECT c FROM Citizen c WHERE c.citizenName = :name");
        query.setParameter("name", name);
        return (Citizen) query.getSingleResult();
    }

    public List<Country> getAllCountries() {
        Query query = em.createQuery("SELECT c FROM Country c");
        return (List<Country>) query.getResultList();
    }


}
@无状态
公共类数据访问{
@持久上下文
实体管理器;
公共无效存储国家/地区(国家/地区){
em.persist(国家);
}
公共无效公民(公民){
em.persist(公民);
}
公共公民getCitizenByName(字符串名称){
Query Query=em.createQuery(“从Citizen c中选择c,其中c.citizenName=:name”);
query.setParameter(“name”,name);
return(Citizen)query.getSingleResult();
}
公共列表getAllCountries(){
Query Query=em.createQuery(“从国家c中选择c”);
return(List)query.getResultList();
}
}

是否有可能通过加入查询从某个用户处获取我想要的动画?或者只有在我从该用户处获得对象后才能通过获取用户并获取列表。我不确定是否理解您的问题。我尝试使JPQL尽可能简单,并让JPA提供商完成其余工作。您想要获取所有动画吗在我的例子中,把国家换成你的用户,把公民换成动漫,就可以了。
    Citizen citizen1 = new Citizen("Smith");
    Citizen citizen2 = new Citizen("Kowalski");
    Citizen citizen3 = new Citizen("Muller");
    dataAccess.saveCitizen(citizen1);
    dataAccess.saveCitizen(citizen2);
    dataAccess.saveCitizen(citizen3);

    // now let's fetch them from DB, along with their other properties (only id in this case)
    citizen1 = dataAccess.getCitizenByName("Smith");
    citizen2 = dataAccess.getCitizenByName("Kowalski");
    citizen3 = dataAccess.getCitizenByName("Muller");

    Country country1 = new Country("Foo");
    Country country2 = new Country("Bar");

    // create lists to hold citizens for each country
    List<Citizen> citizenList1 = new ArrayList();
    List<Citizen> citizenList2 = new ArrayList();

    // add elements to the lists
    citizenList1.add(citizen1);
    citizenList1.add(citizen2);        
    citizenList2.add(citizen2);
    citizenList2.add(citizen3);

    //assign lists of citizens to each country
    country1.setCitizens(citizenList1);
    country2.setCitizens(citizenList2);

    //save data in DB
    dataAccess.saveCountry(country1);
    dataAccess.saveCountry(country2);

    //fetch list of all persisted countries (associated Citizens will come along)
    countries = dataAccess.getAllCountries();
@Stateless
public class DataAccess {

    @PersistenceContext
    EntityManager em;

    public void saveCountry(Country country) {
        em.persist(country);
    }

    public void saveCitizen(Citizen citizen) {
        em.persist(citizen);
    }

    public Citizen getCitizenByName(String name) {
        Query query = em.createQuery("SELECT c FROM Citizen c WHERE c.citizenName = :name");
        query.setParameter("name", name);
        return (Citizen) query.getSingleResult();
    }

    public List<Country> getAllCountries() {
        Query query = em.createQuery("SELECT c FROM Country c");
        return (List<Country>) query.getResultList();
    }


}