Java JPQL多个单向查询
我一直在论坛上到处寻找一个单向的很多问题。我发现了许多例子,但我无法真正根据自己的需要调整它们:( 我有2个实体类(动画和用户)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
动画{
@身份证
@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();
}
}