ورود

View Full Version : سوال: سلکت در jpa



anisaanisa
پنج شنبه 25 شهریور 1389, 17:08 عصر
سلام

کسی میتونه تو حله این مسئله کمک کنه؟

2 تا کلاس هست که one to many با هم join شدن

میخام از لیستی از کلاسه دوم query بگیزم اما نمیدونم توییه jpa چجوری میشه از 2 تا کلاسه مختلف این کارو کرد

راهش map join هس؟

میشه یه sample یه سورس معرفی کنی؟

ممنون

anisaanisa
جمعه 26 شهریور 1389, 12:19 عصر
یه کلاسه سواله
یه کلاسه جوابه
one to many جواب با سوال join شدن(لیستی از جوابا تو سواله)
اگه بخام جوابی که شماره سوالش 4 هست به فرضو بخونم چه جوری باید query باشه؟؟

javaphantom
شنبه 27 شهریور 1389, 16:11 عصر
یه کلاسه سواله
یه کلاسه جوابه
one to many جواب با سوال join شدن(لیستی از جوابا تو سواله)
اگه بخام جوابی که شماره سوالش 4 هست به فرضو بخونم چه جوری باید query باشه؟؟




@Entity
@Table(name = "perosn", schema = "babak")
public class Person implements Serializable {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "family")
private String family;

@OneToMany(mappedBy = "person")
private List<PhoneBook> phoneBooks;


public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

public List<PhoneBook> getPhoneBooks() {
return phoneBooks;
}

public void setPhoneBooks(List<PhoneBook> phoneBooks) {
this.phoneBooks = phoneBooks;
}



@Entity
@Table(name = "phone_book", schema = "babak")
public class PhoneBook implements Serializable {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;

@Column(name = "ter")
private String tel;

@ManyToOne
@JoinColumn(name = "fk", referencedColumnName = "id")
private Person person;


public Integer getId() {
return id;
}

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

public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}

public Person getPerson() {
return person;
}

public void setPerson(Person person) {
this.person = person;
}

چند حالت select


select p from Person as p


select p from Person as p where p.id = 10


select p from Person as p where p.id := id


select phone from PhoneBook as phone


selec ph from PhoneBook as ph where ph.person.id = 10

anisaanisa
دوشنبه 29 شهریور 1389, 10:27 صبح
مزسی از اینکه وقت گذاشتی و جواب دادی

امما این باید id که در کلاسه answere هستو بدی

امما من میخام id سوال بدم که بهم جواب همون شوالو بده



میدونی اصلا چه شکلی منظورمه؟؟

مثل امتحان 4 گزینه ای دیگه

که جوابام تو radio باشه

javaphantom
دوشنبه 29 شهریور 1389, 13:41 عصر
مزسی از اینکه وقت گذاشتی و جواب دادی

امما این باید id که در کلاسه answere هستو بدی

امما من میخام id سوال بدم که بهم جواب همون شوالو بده



میدونی اصلا چه شکلی منظورمه؟؟

مثل امتحان 4 گزینه ای دیگه

که جوابام تو radio باشه



String queryCommand="select p from Person p where p.id = 10";

Person p = (Person) emm.createQuery(queryCommand).getSingleResult();

for (PhonBook phoneBook : p.getPhoneBooks()) {
System.out.println("phoneBook.getTel() = " + phoneBook.getTel());
}

anisaanisa
دوشنبه 29 شهریور 1389, 19:27 عصر
بزار مثالی که کلافم :عصبانی++: کردرو بهت بگم تا روی اون بهم راهنمایی کنی

کلاسام که مثل همونی بود که گفتی

یه کلاسه جواب . یه کلاسه سوال که توش لیستی از جواباس

برای ذخیره کردن هم که اگه سوالو ذخیرا کنم جوابه مربوط به اون سوالم ذخیره میشه

*برای ظاهر صفحه میخام

سوال که نشون دادده میشه جوابه مربوط به همون سوال نشون داده بشه

برای این کار :

یه سلکت دارم که تمامه سوالارو میده

با یه سلکت که سوالی که id بهش دادمو میده

برای سکلت دومی که نیاز به id هست ,داخله تمامه سوالا که با استفاده از سلکت اولیه میگردم و idشو پیدا میکنم و به سلکت دومی میدم که باید بهم لیستی از جوابای اون سوالو بده

بعدش این جوابارو باید روبروی هر سوال داخله radiobtn نشون بده

این کارو داخله selectItem میکنم

امما به جای اینکه همون جوابی که برای سوال هستو بیاره تمامه جوابارو میاره

زاهنماییت چیه؟ اصلا کاری که میکنم درسته؟ یا باید از یه راهه دیگه این کارو کنم؟؟

---اصلا از توضیحی که دادم چیزی متوجه شدی؟؟؟ :بامزه:

میخای کدمو بدم؟؟؟ ----

javaphantom
دوشنبه 29 شهریور 1389, 21:00 عصر
مزسی از اینکه وقت گذاشتی و جواب دادی

امما این باید id که در کلاسه answere هستو بدی

امما من میخام id سوال بدم که بهم جواب همون شوالو بده



میدونی اصلا چه شکلی منظورمه؟؟

مثل امتحان 4 گزینه ای دیگه

که جوابام تو radio باشه

شما یا احتمالا بلد نیستی با پایگاه داده های رابطه ای کار کنی یا اینکه کلا طراحی و فهمتون از object oriented کافی نیست و مفهوم orm هم مشکل دارید.

توی مثال من اگر دقت کنید یک شخص می تونی چند شماره تلفن داشته باشه پس اگر بصورت object ی نگاه کنیم می بینم که رابطه شخص با دفترچه تلفن رابطه یک به چند است پس اگر باز دقت کنی در کلاس person آرایه یا لیستی از تلفنهاش وجود داره. یعنی اگر من یک سلکت روی شخص می زنم بچهاشم که همون تلفنهای مربوط به شخص برات می یاره دیگه من نمی دونم منظورت چیه.

anisaanisa
سه شنبه 30 شهریور 1389, 15:10 عصر
شایدم قضاوتی که میکنی درست باشه :|

امما تو مثاله خودتم اگر بخای یه لیست داشته باشی که تو هر سطرش نام یه شخص با شماره تلفناش توی radio باشه بازم نمیشه یا حداقل از این راهیکه میریم نمیشه

خودت امتحان کن میبینی

javaphantom
سه شنبه 30 شهریور 1389, 16:28 عصر
شایدم قضاوتی که میکنی درست باشه :|

امما تو مثاله خودتم اگر بخای یه لیست داشته باشی که تو هر سطرش نام یه شخص با شماره تلفناش توی radio باشه بازم نمیشه یا حداقل از این راهیکه میریم نمیشه

خودت امتحان کن میبینی


کدهای مربوط به orm ت رو بزار اینجا ببینم . منظورم persistence object ها تو می گم یعنی class سوال , کلاس جواب

anisaanisa
سه شنبه 30 شهریور 1389, 22:59 عصر
idرو از یه super کلاس میگیره(میتونی همینجام اضافه کنی با@id و)




@NamedQueries({
@NamedQuery(name = "question.getAllQuestions" , query = "select q from Question q")
}
)

@Entity
public class Question extends CRUDEntity<Question> {
private String question;
@OneToMany(cascade = CascadeType.ALL ,fetch = FetchType.LAZY)
private List<Answere> answere;

public Question() {
super();
}

public Question(String question, List<Answere> answere) {
super();
this.question = question;
this.answere = answere;
}

public Question(long id, String question, List<Answere> answere) {
super();
super.setId(id);
this.question = question;
this.answere = answere;
}

public String getQuestion() {
return question;
}

public void setQuestion(String question) {
this.question = question;
}

public List<Answere> getAnswere() {
if(answere == null){
answere = new ArrayList<Answere>();
}
return answere;
}

public void setAnswere(List<Answere> answere) {
this.answere = answere;
}

}





@Entity
public class Answere extends CRUDEntity<Answere> {
private String correctAnswere;
private String wrongAnswereOne;
private String wrongAnswereTwo;
private String wrongAnswereThree;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Question question;

public Answere() {
super();
}

public Answere(String correctAnswere, String wrongAnswereOne,
String wrongAnswereTwo, String wrongAnswereThree, Question question) {
super();
this.correctAnswere = correctAnswere;
this.wrongAnswereOne = wrongAnswereOne;
this.wrongAnswereTwo = wrongAnswereTwo;
this.wrongAnswereThree = wrongAnswereThree;
this.question = question;
}

public Answere(long id, String correctAnswere, String wrongAnswereOne,
String wrongAnswereTwo, String wrongAnswereThree, Question question) {
super();
super.setId(id);
this.correctAnswere = correctAnswere;
this.wrongAnswereOne = wrongAnswereOne;
this.wrongAnswereTwo = wrongAnswereTwo;
this.wrongAnswereThree = wrongAnswereThree;
this.question = question;
}

public String getCorrectAnswere() {
return correctAnswere;
}

public void setCorrectAnswere(String correctAnswere) {
this.correctAnswere = correctAnswere;
}

public String getWrongAnswereOne() {
return wrongAnswereOne;
}

public void setWrongAnswereOne(String wrongAnswereOne) {
this.wrongAnswereOne = wrongAnswereOne;
}

public String getWrongAnswereTwo() {
return wrongAnswereTwo;
}

public void setWrongAnswereTwo(String wrongAnswereTwo) {
this.wrongAnswereTwo = wrongAnswereTwo;
}

public String getWrongAnswereThree() {
return wrongAnswereThree;
}

public void setWrongAnswereThree(String wrongAnswereThree) {
this.wrongAnswereThree = wrongAnswereThree;
}

public Question getQuestion() {
if(question == null){
question = new Question();
}
return question;
}

public void setQuestion(Question question) {
this.question = question;
}

}

javaphantom
چهارشنبه 31 شهریور 1389, 09:15 صبح
ما کردیم شد


این تغییرات رو من روی entity ها دادم و کار می کنه هم entity رو برات می زارم هم کد نوشته شده هم تست




@Entity
@Table(name = "question", schema = "babak")
public class Question implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String question;

@OneToMany(cascade = CascadeType.ALL ,fetch = FetchType.LAZY,mappedBy = "question")
private List<Answer> answerList;

public Question() {

}


public Integer getId() {
return id;
}

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

public String getQuestion() {
return question;
}

public void setQuestion(String question) {
this.question = question;
}

public List<Answer> getAnswerList() {
return answerList;
}

public void setAnswerList(List<Answer> answerList) {
this.answerList = answerList;
}
}



@Entity
@Table(name = "answer", schema = "babak")
public class Answer implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String correctAnswer;
private String wrongAnswerOne;
private String wrongAnswerTwo;
private String wrongAnswerThree;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "fk_question",referencedColumnName = "id")
private Question question;

public Answer() {

}


public Integer getId() {
return id;
}

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

public String getCorrectAnswer() {
return correctAnswer;
}

public void setCorrectAnswer(String correctAnswer) {
this.correctAnswer = correctAnswer;
}

public String getWrongAnswerOne() {
return wrongAnswerOne;
}

public void setWrongAnswerOne(String wrongAnswerOne) {
this.wrongAnswerOne = wrongAnswerOne;
}

public String getWrongAnswerTwo() {
return wrongAnswerTwo;
}

public void setWrongAnswerTwo(String wrongAnswerTwo) {
this.wrongAnswerTwo = wrongAnswerTwo;
}

public String getWrongAnswerThree() {
return wrongAnswerThree;
}

public void setWrongAnswerThree(String wrongAnswerThree) {
this.wrongAnswerThree = wrongAnswerThree;
}

public Question getQuestion() {
return question;
}

public void setQuestion(Question question) {
this.question = question;
}
}


لایه dao


public class CommonDao {


@PersistenceContext(unitName = "myTest")
private EntityManager em;



public Question getAnswersByQuestionId(Integer questionId) throws Exception {

Query query = em.createQuery("select q From Question as q where q.id = :id");
query.setParameter("id", questionId);

return (Question) query.getSingleResult();

}

}


لایه business


public class MyBiz {

@Autowired
@Qualifier("commonDao")
private CommonDao commonDao;

@Transactional
public List<Answer> getAnswersByQuestionId(Integer questionId) throws Exception {

Question question = commonDao.getAnswersByQuestionId(questionId);

if(question == null) throw new Exception();

ArrayList<Answer> answers = new ArrayList<Answer>();

for(Answer answer : question.getAnswerList()) {
answers.add(answer);
}
return answers;
}
}



تست انجام گرفته با فرض اینکه قبلا یک رکورد هم برای question وهم برای answer وجود داره


@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public class MyBizTest {

@Autowired
private MyBiz myBiz;

@Autowired
private CommonDao commonDao;



@Test
public void testAnswerByQuestionId() throws Exception {
List<Answer> answers = this.myBiz.getAnswersByQuestionId(1);
int result = answers.size();
Assert.assertEquals(1, result);

for (Answer answer : answers) {
Assert.assertEquals("Yes I am",answer.getWrongAnswerOne());
Assert.assertEquals("Maybe",answer.getWrongAnswerThree());
Assert.assertEquals("One day",answer.getWrongAnswerTwo());
Assert.assertEquals("No I am not",answer.getCorrectAnswer());
}
}

}

anisaanisa
چهارشنبه 31 شهریور 1389, 19:20 عصر
بعضی از @... ماله spring هست؟؟
مثله اونایی که در myBizTest هست؟؟
میشه source معرفی کنی برم بخونمشون آخه اصلا آشنایی ندارم؟؟

javaphantom
پنج شنبه 01 مهر 1389, 09:52 صبح
شما اول باید با مفهوم TDD آشنا بشی بعد یکسری pattern داره و ابزار spring که گفتید بله درسته spring بخاطر داشتن IoC که داره ابزار خوبی هست برای TDD و کلا تست گرفتن
منبع که می خواهید اول با مفهوم agile باید آشنا بشید بعد با TDD بعد با JUnit بعد کم کم با مفهوم stub و mock Object و برو برو برو

anisaanisa
پنج شنبه 01 مهر 1389, 10:41 صبح
شما اول باید با مفهوم TDD آشنا بشی بعد یکسری pattern داره و ابزار spring که گفتید بله درسته spring بخاطر داشتن IoC که داره ابزار خوبی هست برای TDD و کلا تست گرفتن
منبع که می خواهید اول با مفهوم agile باید آشنا بشید بعد با TDD بعد با JUnit بعد کم کم با مفهوم stub و mock Object و برو برو برو


پس کلی راه باید برم تا حداقل مثالتونو متوجه شم
به هر حال خیلی ممنون:لبخندساده:

javaphantom
پنج شنبه 01 مهر 1389, 11:24 صبح
پس کلی راه باید برم تا حداقل مثالتونو متوجه شم
به هر حال خیلی ممنون:لبخندساده:

شما به طراحی ENTITY هات نگاه کن که JOINCOLUMN نزدی و چندتا نکته دیگه که توی ENTITY هایی من برات گذاشتم اعمال شده. اونا رو که دیگه بلدی.

قسمت تست نویسی هم که اگر کسی که می خواد بگه من برنامه نویس نیستم و DEVELOPER هستم باید بلد باشه و گرنه همون برنامه نویس و اینجام خوب اسمش باهاش برنامه نویس.

ولی قسمت تست من به طراحیم ربطی نداره شما توی قست طراحی اشتباه داشتین به او دقت کنید